IC脚本之perl

news/2024/11/25 9:07:45/

        Perl 是一种功能丰富的计算机程序语言,运行在超过100种计算机平台上。IC flow 的 流传的古老版本大多是也是使用这种语言,这里会对Perl的常用知识点进行总结。 

Note: 所有的语句必须以 “ ;”结尾;所有的数据必须先定义才可以使用;

Getopt::Long获取命令行参数用法

1.   变量

        Perl中的数据类型分为变量,数组(类似于python的list),hash(类似于python中的字典)。可以分别通过 my $var; my @array; my %hash; 定义数据结构。

变量包含数字变量以及字符串变量;如果变量未被赋值,它是一个undef 变量, 可以通过define($var) 判断其结构。

1. if (defined($a))  #判断a变量是否被使用赋值。
2. 字符串拼接$a."hello"    通过" . "拼接join($a,"hello" 通过join函数拼接。$a.="hello"     通过" .="将字符串拼接到另一个字符串,但是改变了字符串内容。使用Perl 5.10及以上版本的say函数(需要在脚本开头加入use feature 'say';或者use 5.010;):
say $a."hello"  ; 会把拼接的字符串打印到命令行,并自动换行。    

数组结构

push  @array  data  # 将data存储在数组array的最后一个位置,这里的data可以是任意数据结构。
pop  @array   out_data # 从array数组弹出最后一个位置的元素,并赋值给out_data.unshift  @array  data  函数会在数组的开头添加一个或多个元素。
shift @array   out_data 函数会从数组的开头移除一个元素,并返回这个被移除的元素

hash结构

        哈希是Perl中的第三种基本数据类型。与数组一样,哈希包含了许多个标量。数组与哈希的差别是:哈希是按照名字来访问它们的标量的,而不是像数组那样使用数字标号进行访问。

哈希元素包含两个部分,即一个关键字和一个

my %hash_test;
$hash_test{"a"}="APPLE"  #通过$hash_name{"key"}读写变量
keys %hash_test  #返回hash_test的所有键。
values %hash_test #返回hash_tes的所有values
delete $hash_test{"a"} #删除a 的元素

2. 分支结构

主要是if-else结构

if-else 结构
if (condition) {commands1;
} else {commands2;
}if-elsif- else 结构
if (condition1) {commands1;
} elsif (condition2) {commands2;
} else {commands3;
}

3. 循环结构

        只要表达式为True,while循环就会重复执行该代码段

while (condtion) {expression;
} 

for 循环

for (var; condition; incr or decrease) {commands;
}eg
@boy=qw(Greg Peter Bobby);
for($index=0;$index<@boy;$index++){print "My favorite is $boy[$index]\n"
}

foreach 经常用于数组的遍历

#!/usr/bin/perl -w
my $b ;
@boy=qw(Greg Peter Bobby);
foreach $b (@boy) {print $b."\n";
}

        针对循环结构还存在 last , next语句控制循环进程。last 则是满足某一条件后退出本次循环loop等价于C语言的break; next 则是满足某一条件事,不在执行本次循环的循环体而跳回循环体,等价于C语言continue。 

4. 函数

        在 Perl中,用户定义的函数称为子例程。与 Perl的内置函数一样,用户定义的函数也可以拥有参数,并且可以将值返回给调用者。

#这里的arg默认输入参数也可以没有,直接使用函数体外的全局遍历
subn fun_name (arg1, arg2, arg3) {expression; 
}#调用函数体
&subname (arg1, arg2, arg3);  
subname arg1, arg2, arg3;

5. 文件操作

        open(filehandle,pathname)     open函数将文件句柄作为它的第一个参数,将路径名作为第二个参数。路径名用于指明要打开哪个文件。

#通过 "<” 设定read模式, ">"设定写模式。
open(MYFILE, "</home/liuye/Scripts/perl/file1.txt") || die "$!";
my $line;
#通过while获取文件内容
while ($line = <MYFILE>) {chomp($line);print ("$line");
}
#通过foreach获取文件内容
my @lines=<MYFILE>
foreach $line ( @lines) {chomp($line);print ("$line");
}
close (MYFILE);

6. 正则表达式

元字符

元字符
. 圆点用于匹配除了换行符外的任何单个字符
\ 在字符前面加上一个反斜杠,使它失去“元”的含义
+ 用于使前面的字符与后面的字符至少匹配一次
* 前面的字符可以进行 0次或多次匹配
? 用于使前面的字符进行 0次或一次匹配
.* 用来匹配任何东西
{n,m}  根据需要的具体次数进行匹配,n是匹配的最小次数,m是匹配的最大次数位置锚定符
"^"代表起始位置,“$"代表结束位置。
\b  字符边界
\B  非字符边界或
| : hell|HELL 表示匹配hell或者HELL。捕获
(?:pattern)	     匹配 pattern 但不获取匹配结果
(?=pattern)		正向肯定预查,标注pattern前面
(?!pattern)		正向否定预查
(?<=pattern)	反向肯定预查
(?<!pattern)	反向否定预查
(?<var_name>pattern)  命名匹配,这种就可以将pattern匹配的内容存放到var_name变量=~ 绑定操作符,它用于将正则匹配操作与哪个变量匹配起来。Example
if ($a =~ m/pattern/ ) #判断 a变量是否匹配设定的pattern。
$a =~ s/old/new/  ;#将 a变量字符串中old字符变成new字符。

常用代码

1. 文件读取

use strict ;
use warnings;
use Getopt::Long;
GetOptions ( 'log=s' => \my $log,'opt=s' => \my $opt
) or usage();my $name; 
my $age;
my $birthday;if (defined($log)) { #判断log变量是否存在print($log."\n"); 
}open $FILE "<filename" or die "Failed to open filename" 
#此时文件的每一行内容存储在内部变量 $_, 循环体内默认对这个变量操作
while (<FILE>) {chomp; #用于移除字符串末尾的换行符(通常是 \n)或其他指定的字符next if(/$\s*(#|\/\/) or /^\s*$/); #跳过注释行和空白行if (/(?<name>\d+)\s+(/(?<name>\w+)\s+(?<birthday>) { print("match \n"); 此时匹配的内容存储到三个字段中$name=$+{name};   通过$+{字段} 来引用匹配的变量 $age=$+{age};$birthday=$+{birthday};}
}
close(FILE);sub usage {print("usate is now \n");
}

2. 对于一些死循环或者缓缓比较久的函数使用键盘终止,可通过异常信号捕捉的形式来处理。

1 linux系统的异常事件信号存储在SIG环境变量,perl通过仿真这些变量来执行相应的异常处理函数。$SIG{'INT'}= \&func;$SIG{'TERM'}= \&func;$SIG{'QUIT'}= \&func;
这里通过 \& 传递func函数的引用。


http://www.ppmy.cn/news/1548959.html

相关文章

STM32与CS创世SD NAND(贴片SD卡)结合完成FATFS文件系统移植与测试是一个涉及硬件与软件综合应用的复杂过程

一、前言 在STM32项目开发中&#xff0c;经常会用到存储芯片存储数据。 比如&#xff1a;关机时保存机器运行过程中的状态数据&#xff0c;上电再从存储芯片里读取数据恢复&#xff1b;在存储芯片里也会存放很多资源文件。比如&#xff0c;开机音乐&#xff0c;界面上的菜单图…

[HNCTF 2022 Week1]你知道什么是Py嘛?

下载附件是一个py文件&#xff0c;python反编译工具打开。 这段代码是一个简单的Python脚本&#xff0c;用于验证用户输入的字符串&#xff08;称为“flag”&#xff09;是否符合特定的格式和加密规则。分析代码是一个简单的xor异或即&#xff1a;程序将遍历字符串的每个字符&…

5、深入剖析PyTorch DataLoader源码

文章目录 1. 重要类2. DataSet3. DataLoader4. Python实例 参考大神B站&#xff0c;记录学习笔记 5、深入剖析PyTorch DataLoader源码 其他大神笔记&#xff1a; pytorch数据操作—dataset&#xff0c;dataloader&#xff0c;transform 1. 重要类 Data LoaderDatasetSampleRa…

.NET 9 中 LINQ 新增功能实操

LINQ 介绍 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 数据查询历来都表示为简单的字符串&#xff0c;没有编译时类型检查或 IntelliSense 支持。 此外&#xff0c;需要针对每种类型的数据源了解不同的查询语言&#xff1a;SQL 数据库、XML 文档、…

【开源风云】从若依系列脚手架汲取编程之道(八)

&#x1f4d5;开源风云系列 &#x1f34a;本系列将从开源名将若依出发&#xff0c;探究优质开源项目脚手架汲取编程之道。 &#x1f349;从不分离版本开写到前后端分离版&#xff0c;再到微服务版本&#xff0c;乃至其中好玩的一系列增强Plus操作。 &#x1f348;希望你具备如下…

二进制之和

问题描述 小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法&#xff0c;将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是&#xff0c;他们的二进制串可能非常长&#xff0c;所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法&…

Windows Server 2022 Web1

载入靶机&#xff0c;看到相关描述&#xff1a; 进入虚拟机发现桌面有phpstudy和解题两个软件&#xff1a; 打开解题.exe&#xff0c;发现里面是一些问题&#xff0c;接下来就需要获取相关信息&#xff1a; 1、shell密码 2、IP地址 3、隐藏账户名称 4、挖矿程序的矿池域名 打…

学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着

ArcGIS水文分析实战教程&#xff08;7&#xff09;细说流域提取_汇流域栅格-CSDN博客 ArcGIS水文分析实战教程&#xff08;6&#xff09;河流提取与河网分级_arcgis的dem河流分级-CSDN博客 ArcGIS水文分析实战教程&#xff08;5&#xff09;细说流向与流量-CSDN博客 ArcGIS …