-
2021-05-11 09:59:21
您当前的perl解释器的位置可以在特殊变量$ ^ X中找到。如果perl不在您的路径中,或者如果您有多个可用的perl版本,但是要确保您全面使用相同的Perl版本,这一点非常重要。
执行外部命令时,包括其他Perl程序,确定它们是否真正运行可能相当困难。检查$?可以留下持久的精神伤疤,所以我更喜欢使用IPC::System::Simple(可从CPAN获得):
use strict;
use warnings;
use IPC::System::Simple qw(system capture);
# Run a command,wait until it finishes,and make sure it works.
# Output from this program goes directly to STDOUT,and it can take input
# from your STDIN if required.
system($^X,"yourscript.pl",@ARGS);
# Run a command,and make sure it works.
# The output of this command is captured into $results.
my $results = capture($^X,@ARGS);
在上述两个示例中,您希望传递给外部程序的任何参数都可以转到@ARGS。在上述两个示例中也避免了shell,这样可以提供较小的速度优势,并避免涉及shell元字符的任何不必要的交互。上面的代码也期望你的第二个程序返回一个零退出值来表示成功;如果不是这样,您可以指定允许的退出值的另外的第一个参数:
# Both of these commands allow an exit value of 0,1 or 2 to be considered
# a successful execution of the command.
system( [0,1,2],$^X,@ARGS );
# OR
capture( [0,2,@ARGS );
如果您有一个长期运行的过程,并且您希望在生成数据时处理其数据,那么您可能需要一个管道打开,或者是CPAN中更重的IPC模块之一。
说完所有这一切,任何时候你需要从Perl调用另一个Perl程序,你可能希望考虑如果使用模块是一个更好的选择。开始另一个程序在启动成本和在进程之间移动数据的I / O成本方面承担了相当多的间接费用。它也显着增加了错误处理的难度。如果您可以将外部程序转换为模块,您可能会发现它简化了整体设计。
祝一切顺利,
保罗
更多相关内容 -
perl脚本自动生成UVM验证框架
2021-03-18 23:14:40perl脚本自动生成UVM验证框架 -
MS/perl脚本,分子模拟脚本之计算相互作用能
2022-03-28 20:11:52适用于materials studio,用于计算两体系/层与层/单分子与总体系的相互作用能,计算轨迹文件中每一帧的相互作用能。 -
TCGA免疫浸润_TCGA_perl脚本tcga_mRNA_merge.pl_perl整理tcga_
2021-10-02 08:05:45好用就完了 -
materials_studio_scripts:Perl 脚本可帮助 Material Studio 和 CASTEP
2021-06-24 03:15:09material_studio_scripts Perl 脚本可帮助 Material Studio 和 CASTEP 如果我能追踪到他们,我会添加更多这个 repo 包含与 perl api for materials studio 和 CASTEP 一起使用的脚本,以快速找到模拟的最佳设置或... -
perl脚本:很好的日常Perl脚本集合
2021-02-05 23:17:41perl脚本:很好的日常Perl脚本集合 -
perl 脚本
2022-05-19 10:40:08perl语言 1. 基本语法 perl 语言是用于文本处理语言,它代表实用提取和报告语言,可在各种平台运行(windows unix等) 1.环境搭建与使用 安装perl 软件 perl -v # 检查版本信息 从官网下载perl 软件后,直接将程序...perl语言
1. 基本语法
perl 语言是用于文本处理语言,它代表实用提取和报告语言,可在各种平台运行(windows unix等)
1.环境搭建与使用
安装perl 软件
perl -v # 检查版本信息
从官网下载perl 软件后,直接将程序添加到环境变量即可。
注意事项(链接:https://www.perl.org/get.html):
Perl 在 Window 平台上有 ActiveStatePerl 和 Strawberry Perl 编译器。 ActiveState Perl和 Strawberry Perl最大的区别是 Strawberry Perl 里面有多包含一些 CPAN 里的模块, 所以Strawberry Perl 下载的安装文件有 80多M, 而ActiveState Perl 只有20M 左右。 我们这里使用了 Strawberry Perl 。
windows 安装 perl 后,可以直接实用 Perl + perl 脚本运行(以pl 为文件后缀)
比如:打印 hello world# print 打印函数 print "Hello, world\n";
perl 脚本注释
#注释一 # #注释二 =cut *** =cut =cut #begin comment This is all part of multiline comment. You can use as many lines as you like These comments will be ignored by the compiler until the next =cut is encountered. =cut
2. 语法
1. perl 中空格 单引号 双引号处理
空格: 不做处理 单引号:单引号不插入任何变量或特殊字符 双引号: 双引号插入变量和特殊字符(例如换行符\n)
测试用例:
# 注释 print "hello world\n"; $str1 = "str1 hello world\n"; $str2 = 'str2 hello world\n'; print "$str1 $str2\n"; print '$str1 $str2\n'; running: hello world str1 hello world str2 hello world\n $str1 $str2\n
perl 中转义字符
\" \r \n 等 会影响print 的输出
perl 标识符
Perl标识符是用于标识变量,函数,类,模块或其他对象的名称。Perl变量名称以$,@或%开头,后跟零个或多个字母,下划线和数字(0至9)。 Perl不允许在标识符内使用标点符号,例如@,$和%。Perl是区分大小写的编程语言。
1. perl 数据类型
标量 数组 哈希
- 标量 - 标量是简单的变量。它们前面有一个美元符号($)。标量可以是数字,字符串或引用。引用实际上是变量的地址,我们将在接下来的章节中看到它。
- 数组 - 数组是用数字索引访问的标量的有序列表,数字索引以0开头。它们的前面是“ at”符号(@)。
- 哈希 - 哈希是使用键作为下标访问的键/值对的无序集合。它们前面有一个百分号(%)。
变量修饰符
1)my 作用:把变量的名字和值都限于某个范围内,也就是说,该变量只能本层模块或者函数
可以看到这个变量,高一层或者低一层的都看不到。
2)our 作用:把变量名字限于某个范围,其实就是明确声明一个”全局变量”,虽然是在某个
模块或者函数里面定义,外面的也可以访问,如果已经声明过了,再次用our,表示此处用的和之前声明的our变量
是同一个。
3)local 作用:把值局限于某个范围,该范围与my有所区别的是,包含本层及本层的下层,
但本层的上一层不可以访问。测试用例:
# 变量 以$开头的 $test = "this is a value"; # 数组 以@开头的 @day = ("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"); # 哈希 以%开头的 %table = ("xiaoming",25,"xiaohong",28,"xiaoli",24); print "$test\n"; print "@day[0] @day[1] @day[2] @day[3] @day[4] @day[5]\n"; print "xiaoming: @table{xiaoming} xiaohong: @table{xiaohong} xiaoli: @table{xiaoli}\n"; rinning: this is a value Monday Tuesday Wednesday Thursday Friday Saturday xiaoming: 25 xiaohong: 28 xiaoli: 24
序号数组:Perl提供了用于连续数字和字母的快捷方式
数组大小:
@day = ("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"); $size = @day; $max_ind = $#day; print "$size \n"; print "$max_ind \n"
数组元素添加与删除,函数操作
函数 类型 描述 push push @ARRAY, LIST 将列表的值压入数组的末尾。(尾增) pop pop @ARRAY 弹出并返回数组的最后一个值。(尾删) shift shift @ARRAY 将数组的第一个值移开并返回,将数组缩短1并向下移动所有内容。(头删) unshift unshift @ARRAY, LIST 将列表添加到数组的最前面,并返回新数组中的元素数。(头增) splice splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ] 更换数组中元素 偏移 长度 更换值 split split [ PATTERN [ , EXPR [ , LIMIT ] ] ] 字符串拆分数组 join join EXPR, LIST 数组变成字符串 sort sort [ SUBROUTINE ] LIST 数组排序 哈希定义(键和值):
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
获取键(keys)和值(values)的函数
测试用例:@test = (1..10); print "@test\n"; %table = ("xiaoming",25,"xiaohong",28,"xiaoli",24); #相同含义 #%table = ('xiaoming',25,'xiaohong',28,'xiaoli',24); #%table = ('xiaoming'=>25,'xiaohong'=>28,'xiaoli'=>24); print "@table{xiaoming} @table{xiaohong} @table{xiaoli}\n"; @test_key = keys %table; @test_value = values %table; print "@test_key @test_value"; running: 1 2 3 4 5 6 7 8 9 10 25 28 24 xiaoli xiaohong xiaoming 24 28 25
哈希需要计算大小,需要获取出其keys 或者values 变成数组,计算其大小
哈希的添加删除
# 哈希添加删除 %data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40); @keys = keys %data; $size = @keys; print "1 - Hash size: is $size\n"; # adding an element to the hash; $data{'Ali'} = 55; @keys = keys %data; $size = @keys; print "2 - Hash size: is $size\n"; # delete the same element from the hash; delete $data{'Ali'}; @keys = keys %data; $size = @keys; print "3 - Hash size: is $size\n";
2. 条件语句
++if语句++
if(boolean_expression) { # statement(s) will execute if the given condition is true } #例如 if(boolean_expression 1) { # Executes when the boolean expression 1 is true } elsif( boolean_expression 2) { # Executes when the boolean expression 2 is true } elsif( boolean_expression 3) { # Executes when the boolean expression 3 is true } else { # Executes when the none of the above condition is true }
++unless语句++
unless(boolean_expression 1) { # Executes when the boolean expression 1 is false } elsif( boolean_expression 2) { # Executes when the boolean expression 2 is true } elsif( boolean_expression 3) { # Executes when the boolean expression 3 is true } else { # Executes when the none of the above condition is met }
++switch语句++
use Switch; switch(argument) { case 1 { print "number 1" } case "a" { print "string a" } case [1..10,42] { print "number in list" } case (\@array) { print "number in list" } case /\w+/ { print "pattern" } case qr/\w+/ { print "pattern" } case (\%hash) { print "entry in hash" } case (\&sub) { print "arg to subroutine" } else { print "previous case not true" } }
三目运算符 ? : 与c语言一致
++while++ 循环
while(condition) { statement(s); } do { statement(s); }while( condition );
**++for循环语句++
**for ( init; condition; increment ) { statement(s); }
无限循环
for( ; ; ) { printf "这里将永远执行.\n"; } while( true ) { printf("这里将永远执行.\n"); }
循环类型 描述 while循环 在给定条件为真时重复一个语句或一组语句。它在执行循环体之前测试条件 until循环 重复一个语句或一组语句,直到给定条件变为真为止。它在执行循环体之前测试条件。 for循环 多次执行一系列语句,并简化管理循环变量的代码。 foreach 循环 foreach循环遍历常规列表值,并将变量var 依次设置为列表的每个元素。 do… while循环 它更像while语句,除了它在循环主体的末尾测试条件(do…while循环至少会执行一次)。 嵌套循环 您可以在任何其他while,for或do…while循环内使用一个或多个循环 测试用例:
$tmp = 30; @pl_value = (15..35); #for($index=15;$index<35;$index=$index+1) for( $index = 10; $index < 20; $index++ ) { if(@pl_value[$index] >= 30) { #print "the value is @pl_value[$index]\n"; use Switch; switch(@pl_value[$index]) { case 30 {print "the value is @pl_value[$index]\n"} case 31 {print "the value is @pl_value[$index]\n"} case 32 {print "the value is @pl_value[$index]\n"} case 33 {print "the value is @pl_value[$index]\n"} case 34 {print "the value is @pl_value[$index]\n"} case 35 {print "the value is @pl_value[$index]\n"} else {print "the value is null"} } } } runningL: the value is 30 the value is 31 the value is 32 the value is 33 the value is 34 #foreach 测试 @list = (2, 20, 30, 40, 50); # foreach loop execution foreach $a (@list) { print "value of a: $a\n"; } rinning: value of a: 2 value of a: 20 value of a: 30 value of a: 40 value of a: 50
++循环使用关键字++
next continue last goto2. 运算符
perl 支持的运算符如下
- 算术运算符
操作符 描述 例子 + 加两个操作数。 $a + $b将得到30 - 从第一个减去第二个操作数。 a − a- a−b将得到-10 * 将两个操作数相乘。 $a * $b将给出200 / 将分子除以除分母。 $b / $a将给出2 % 模运算符和整数除法后的余数。 $b % $a将给出0 ** 对运算符执行指数(幂)计算 $a ** $b将得到10的20次方 - 关系运算符
操作符 描述 例子 == 检查两个操作数的值是否相等。如果是,则条件变为真。 ($a == $b)为false。 != 检查两个操作数的值是否相等。如果值不相等,则条件为真。 ($a != $b)为true。 <=> 检查两个操作数的值是否相等,并根据左参数在数值上小于,等于或大于右参数而返回-1、0或1。 ($a <=> $b)为 -1。 > 检查左操作数的值是否大于右操作数的值。如果是,则条件变为真。 ($a > $b) 为false。 < 检查左操作数的值是否小于右操作数的值。如果是,则条件变为真。 ($a < $b)为true。 >= 检查左操作数的值是否大于或等于右操作数的值。如果是,则条件变为真。 ($a > = $b)为false。 <= 检查左操作数的值是否小于或等于右操作数的值。如果是,则条件变为真。 ($a <= $b)为true。 - 字符串运算符
操作符 描述 例子 lt 如果left参数在字符串上小于right参数,则返回true。 ($a lt $b) 为 true. gt 如果left参数在字符串上大于right参数,则返回true。 ($a gt $b) 为 false. le 如果left参数在字符串上小于或等于right参数,则返回true。 ($a le $b) 为 true. ge 如果left参数在字符串上大于或等于right参数,则返回true。 ($a ge $b) 为 false. eq 如果left参数在字符串上等于right参数,则返回true。 ($a eq $b) 为 false. ne 如果left参数沿字符串方向不等于right参数,则返回true。 ($a ne $b) 为 true. cmp 返回-1、0或1,具体取决于左参数是按字符串方式小于,等于还是大于右参数。 ($a cmp $b) 为 -1. - 赋值运算符
操作符 描述 例子 = 简单的赋值运算符。将值从右侧操作数分配给左侧操作数 $c = $a+ b 将 b将 b将a + b 的 值 赋 给 b的值赋给 b的值赋给c += 加和赋值运算符。它将右操作数添加到左操作数,并将结果分配给左操作数。 $c + = a 等 于 a等于 a等于c = $c + $a -= 减和赋值运算符。它从左侧操作数中减去右侧操作数,并将结果分配给左侧操作数。 $c-= a 等 效 于 a等效于 a等效于c = c − c- c−a *= 乘以和赋值运算符。它将右操作数与左操作数相乘,并将结果分配给左操作数。 $c * = a 等 效 于 a等效于 a等效于c = $c * $a /= 除和赋值运算符。它将左操作数除以右操作数,并将结果分配给左操作数。 $c / = a 等 于 a等于 a等于c = $c / $a %= 模和赋值运算符。它使用两个操作数取模,然后将结果分配给左操作数。 $c%= a 等 于 a等于 a等于c = c % c% c%a **= 指数和赋值运算符,对运算符执行指数(幂)计算并将值赋给左操作数 c = $ a等效于$c = $c $a - 按位运算符
&,|和^
- 逻辑运算符
&& and || or not !
操作符 描述 例子 and 称为逻辑AND运算符。如果两个操作数都为真,则条件为真。 ($a and $b)为false。 && 称为逻辑与运算符。如果两个操作数都不为零,则条件变为true。 ($a && $b)为false。 or 称为逻辑或运算符。如果两个操作数中的任何一个都不为零,则条件为真。 ($a or $b)为true。 not 称为逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑非运算符将为假。 !($a && $b)为false。 - 类引用运算符
操作符 描述 例子 q {} 用单引号将字符串引起来 q {abcd} 得 ‘abcd’ qq {} 用双引号将字符串引起来 qq {abcd} 得 “abcd” qx {} 用反引号引起来的字符串 qx {abcd} 得 abcd
- 杂项运算符
操作符 描述 例子 . 二进制运算符点(.)连接两个字符串 如果 a = “ a b c ” , a=“abc”, a=“abc”,b =“def”,则 a . a. a.b将 得到 “abcdef” x 重复运算符x返回由左操作数组成的字符串,该字符串重复了右操作数指定的次数。 (‘-’ x 3)将得到 —。 … 范围运算符…返回从左值到右值计数(逐个递增)的值列表 (2…5)将得到(2,3,4,5) ++ 自动增量运算符将整数值增加一 $a++将给出11 – 自动减量运算符将整数值减一 $a–将给出9 -> 箭头运算符主要用于从对象或类名中解引用方法或变量 o b j − > obj-> obj−>a是从对象 o b j 访 问 变 量 obj访问变量 obj访问变量a的示例。 3. 时间相关
相关函数
函数一:
localtime() #系统时间#time相关函数 $time = localtime(); print "$time\n"; #output Tue May 10 11:43:30 2022
函数二:
gmtime() #utc时间 不带tz$time1 = gmtime(); print "$time1 \n"; #output Tue May 10 03:49:08 2022
函数三:
time() #1970年到现在的秒数$time2 = time(); print "$time2 \n"; #output 1652154548
函数四:
sleep$time = localtime(); print "$time\n"; $time1 = gmtime(); print "$time1 \n"; $time2 = time(); #1970年到现在的秒数 print "$time2 \n"; sleep 5; $time4 = localtime(); print "$time4 \n"; $time3 = localtime($time2); #1970 s转换成时间 print "$time3 \n";
函数五:
strftime() #格式化输出时间use POSIX qw(strftime); print strftime("%Y-%m-%d %H:%M:%S\n", localtime(time)); #Output 2022-05-10 13:18:40
4. 函数
函数定义
sub subroutine_name {
body of the subroutine
}传参:@_ 接收
return 返回值
test 一:
函数定义与传参,返回值#function sub test_add { print "this is a function @_[0] @_[1] @_[2] \n"; return @_[0]+@_[1]+@_[2] } $ret = test_add(10,20,30); print "this value is $ret \n";
test 二:
数组传参#function 数组传参 sub test_add { $test_size = @_; $add_value = 0; print "this is a function $test_size \n"; while($test_size >= 0) { $add_value = $add_value + @_[$test_size]; $test_size --; print "this value is $add_value \n"; } return $add_value; #return @_[0]+@_[1]+@_[2] } @test = (10..15); $ret = test_add(@test); print "this value is $ret \n";
test 三:
哈希传参#function 哈希传参 sub test_add { $test_size = @_; $add_value = 0; print "this is a function $test_size \n"; while($test_size >= 0) { print "[test_add]this value is @_[$test_size-1] \n"; $test_size --; } %table = @_; @test_key = keys %table; @test_value = values %table; print "@test_key @test_value \n"; return 0; } @test = ("xiaoming",25,"xiaohong",28,"xiaoli",24); $ret = test_add(@test); print "this value is $ret \n";
5. perl io操作
open 操作
print 写入文件
# Open file open(DATA1, "+>file1.txt"); #write file1 print DATA1 "/*-------------------------------------------------------------\n"; print DATA1 "** file name: quectel_test.c\n"; print DATA1 "** function: feature control\n"; print DATA1 "** create date: localtime()\n"; print DATA1 "*-------------------------------------------------------------*/\n"; print DATA1 "#define QUECTEL_TEST1\n"; print DATA1 "#define QUECTEL_TEST2\n"; print DATA1 "#define QUECTEL_TEST3\n"; # Open new file to write open(DATA2, ">file2.txt"); # Copy data from one file to another. while(<DATA1>) { print DATA2 $_; } close( DATA1 ); close( DATA2 );
实体 定义 <或r 只读访问 >或w 创建,写入和截断 >>或> 编写,附加和创建 +<或r+ 读写 +>或w+ 读取,写入,创建和截断 +>>或a+ 读取,写入,附加和创建 getc 函数
getc 函数从指定的FILEHANDLE中返回单个字符,如果未指定则返回STDIN-read 函数
read 函数从缓冲的文件句柄中读取信息块:此函数用于从文件中读取二进制数据。6. perl 错误处理
warn 函数
warn 函数仅会发出警告,一条消息会打印到STDERR,但不会采取进一步措施。因此,如果您只想为用户打印警告并继续进行其余操作,它会更有用-die 函数
die 函数的作用与 warn 相似,只是它还会调用 exit。在普通脚本中,此函数具有立即终止执行的作用。如果程序中有错误,则应使用此功能以防继续进行-2. perl 操作不同格式文件
excel 环境需要安装WriteExcel 插件(暂时先不搞了 环境一直有问题)
注意事项:安装cpanm 安装模块1.安装perl 2.dmake: http://mirrors.163.com/cpan/authors/id/S/SH/SHAY/dmake-4.12.2.2.zip 3.cpanm(App::cpanminus): http://mirrors.163.com/cpan/authors/id/M/MI/MIYAGAWA/App-cpanminus-1.7040.tar.gz 4. 安装perl并添加环境变量(exe文件里面有提示添加,可以在那里添加即可,假设Perl安装路径是D:\Perl64)。 3. 将dmake-4.12.2.2.zip解压,把 startup 文件夹和 dmake.exe 文件放入D:\Perl64\bin 4. 解压App-cpanminus-1.7040.tar.gz 到任意目录,cmd窗口进入,输入如下命令: perl Makefile.PL dmake test dmake install 5.使用cpanm 安装缺少的模块
操作excel(使用OLE模块) 实例
use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; $AT_LIST_XLS = "test.xlsx"; $sheetname = "at"; my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); # get already active Excel # application or open new #新建 #my $Book = $Excel->Workbooks->add; #my $Sheet = $Book->Worksheets(1); #打开已经有的 my $Book = $Excel->Workbooks->Open($AT_LIST_XLS); # open Excel file my $Sheet = $Book->Worksheets($sheetname); $row = 1; $col = 1; while(1) { $ret = $Sheet->Cells($row, $col)->{'Value'}; #取值 根据行和列 if (length($ret) == 0) #读到第一列如果为空,不再继续读,退出excel { last; }else { $Sheet->Cells($row, $col+1)->{'Value'} = send_at($ret); #写值 根据行和列 } $row++; #send_at($ret); } $Book->SaveAs($AT_LIST_XLS); $Book->Close;
json 安装json模块
xml 安装xml 模块3. perl 操作设备
注意事项: SerialPort这个模块的使用 需要安装perl Strawberry版本 否则会报错
操作窗口设备 发送at指令
#强制全局变量用my修饰 use strict; #使用串口模块 use Win32::SerialPort; #定义串口,并打开它 my $testPORTNAME = "COM13"; my $ob = Win32::SerialPort->new($testPORTNAME) || die "open com failed"; print "open com success\n"; #配置串口设置 eval { $ob -> baudrate( 115200 ); #如果使用超过115200的波特率,执行脚本前先用串口通信工具用对应波特率打开串口,发个AT。 $ob -> parity( 'none' ); $ob -> databits( 8 ); $ob -> stopbits( 1 ); #$ob -> handshake( 'rts' ); #硬件流控 $ob -> handshake( 'none' ); #无流控 #$ob->buffers(4096, 4096); }; if ($@) { die ' set $testPORTNAME properties failed ' ;} $ob -> write_settings || die " CANNOT WRITE $testPORTNAME DRIVER "; #发送at命令 $ob->write ("ATI\r\n"); #写到串口 sleep(1); #读取命令返回值 my($count, $string) = $ob->read(100); #从串口读100字节数据,读到的数据长度$count, 数据赋值给$string if(defined($string)) #读到了数据 { print $string; } $ob->close; #关闭串口 undef $ob ; exit(0); 测试结果如下: open com success ATI Quectel EC20F Revision: EC20CEFARGR06A03M4G_OCPU OK
-
在Java中运行Perl脚本 JERL
2022-06-02 16:11:32在Java中运行Perl脚本 JERL -
可以直接生成tb的perl脚本
2021-01-14 11:21:40可以直接生成tb的perl脚本 -
自动生成filelist.v的perl脚本f
2019-07-29 09:09:09与要生成的.v文件放在同一目录下,输入perl filelist_gen 即可 -
perl脚本运用udp实现控制其它电脑开机
2020-08-18 16:10:53一个简单的perl脚本控制其它电脑开机例子,运用了udp协议的socket通信机制,通过目标电脑的MAC地址就可以控制其开机操作。 -
perl脚本调用练习和调用系统命令并展示输出信息
2019-03-20 03:40:10NULL 博文链接:https://fruitking.iteye.com/blog/799757 -
gb2fasta:Perl脚本,用于将GenBank记录转换为FASTA格式
2021-02-05 15:46:41gb2fasta:Perl脚本,用于将GenBank记录转换为FASTA格式 -
R0-1_R1_三嗪环形成_交联_自编perl脚本_
2021-10-02 05:19:07可以实现邻苯二甲腈类树脂在酚羟基的催化下实现三嗪环交联单元的形成。 -
oracle数据库同步perl脚本示例
2017-06-28 10:32:27oracle数据库同步perl脚本示例 其中有2个文件,一个是 perl同步脚本,另一个是存储过程; 大致思路是:perl脚本从数据库A同步数据至库B的临时表中,再通过存储过程将库B中的临时数据过滤导入正式数据当中。 -
Perl脚本中单元测试自动化浅析
2021-01-31 10:18:19随着敏捷开发模式的流行,如何快速高效地适应不确定或经常性变化的需求显得越来越重要。要做到这一点,需要在开发过程的各个阶段引入足够的测试。...目前,比较通用的Perl单元测试框架模块主要有Test::Class -
Perl脚本实例
2018-01-12 22:01:24Perl脚本实例,其中包含常用的基本语法,便于学习掌握 -
可以自动生成Verilog的Testbench的Perl脚本
2016-12-02 14:31:23以后不需要再手写Testbech了,直接用这个就可以,输入你的verilog源码,直接就生成了可以测试的Testbench了。 -
Xris Malden Pictures:基于EXIF元数据进行图像处理的Perl脚本-开源
2021-05-12 15:12:39Perl脚本可根据其EXIF元数据来操作图像...对原始图像文件特别是尼康相机非常有用(使用尼康相机的ShutterCount元数据进行文件重命名)先决条件:一些Perl Image :: ExifTool, File :: Basename和FileHandle模块2个... -
dnstunnel:运行DNS隧道服务器的Perl脚本
2021-02-05 21:39:47dnstunnel:运行DNS隧道服务器的Perl脚本 -
Perkes Encode:Perl脚本编码声音文件-开源
2021-05-10 07:08:38Perl脚本可对具有la脚(mp3),flac,aac(m4a)和oggenc2(ogg vorbis)的声音文件进行编码(解码)。 利用多线程来利用多核处理器的速度。 -
HTTPSearch:用于搜索敏感网站的简单 Perl 脚本-开源
2021-07-19 05:34:53一个 perl 脚本,它使用三个 Linux 程序(nmap、grep 和 wget)来查找、检索和分类可能在网络上运行的网站。 -
perl脚本perl脚本perl脚本
2009-11-10 19:21:05perl脚本perl脚本perl脚本perl脚本 -
PerlRun:简单的IntelliJ IDEA插件,用于运行Perl脚本
2021-05-09 05:08:42防暴巴士简单的IntelliJ IDEA插件,用于运行Perl脚本警示语照原样 -
推荐一篇好文章:关于利用perl 脚本产生状态机的verilog代码和DC 脚本的
2019-08-27 22:01:12推荐一篇好文章:关于利用perl 脚本产生状态机的verilog代码和DC 脚本的 -
Perl脚本编程
2021-09-23 16:47:28Perl脚本学习笔记 文章目录Perl脚本学习笔记一、编写你的第一个Perl程序二、Perl的基本构件1.直接量2.标量变量3.表达式和运算符三、控制程序流1.if 语句总结 一、编写你的第一个Perl程序 #!/usr/bin/perl print ...Perl脚本学习笔记
文章目录
一、编写你的第一个Perl程序
#!/usr/bin/perl -w #-w 可以报错 print "Hello, World!\n";
常用的扩展名是.pl或.plx,运行hello.pl,执行perl hello.pl
二、Perl的基本构件
1.直接量
Perl拥有两种不同类型的标量常量,它们都称为直接量。一种是数字直接量,一种是字符串直接量。
数字直接量都是一些数字,Perl可以接受若干种不同的数字写法。
给字符串加引号有两种主要方法,一种是使用单引号(’ '),一种是使用双引号(" ")。
差别是使用单引号的字符串含义是非常直观的,单引号字符串中的每个字符就是表示它自己的含义。在双引号中的字符串中,Perl要查看是否存在变量名或转义字符。
perl还提供了另一个引号机制,即qq和q运算符分别代替双引号和单引号。qq(I said , "Go then," and he said "I'm gone") q(Tom's kite wedged in Sue's tree)
2.标量变量
若要将标量数据存放在Perl中,必须使用标量变量。在 Perl中,如果要写一个标量变量,可以写一个美元符号,后跟变量的名字。
$a3.表达式和运算符
字符串运算符
并置运算符用圆点来表示(.)#!/usr/bin/perl $a="Hello,World"; $b=" Nice to meet you"; $c=$a . $b; print "$c\n";
执行结果:
重复运算符x
运算符x配有两个参数,一个是要重复的字符串,另一个是该字符串重复的次数。#!/usr/bin/perl $line= "-" x 7 print "$line\n";
执行结果:
单参数运算符
递增和递减$counter++; $counter--;
尖括号运算符
尖括号运算符(<>),也称菱形运算符,主要用于读写文件。
< STDIN >表达式返回从键盘读取的这行信息#!/usr/bin/perl print "What size is your shoe?"; $size=<STDIN>; print "Your shoe size is $size,Thank you";
< STDIN>表达式从键盘读取信息,直到用户按下 E n t e r键为止。整个输入行返回,并被存放在$size中。由< STDIN >返回的文本行也包含用户键入的换行符(因为按下了 Enter键) 。在大多数情况下,你不希望在字符串的结尾处出现换行符。若要删除换行符,可以像下面这样
使用chomp运算符:print "What size is your shoe?"; $size=<STDIN>; chomp $size; print "Your shoe size is $size, Thank you";
数字关系运算符
字母关系运算符
逻辑运算符
文件测试运算符
三、控制程序流
1.if 语句
单if语句
适用范围:只需要一步判断,条件返回真干什么或者条件返回假干什么if (condition) { commands; }
if-else 语句
适用范围:两步判断,条件为真干什么,条件为假干什么if (condition) { commands1; } else { commands2; }
多重判断
if (condition1) { commands1; } elsif (condition2) { commands2; } else { commands3; }
2.while 循环
只要表达式是真的,while循环就会重复执行该代码段
while (condition) { commands; }
3.for 循环
for (变量;条件;自增自减运算) { commands; }
明细控制
除了使用语句块、for、while 、if以及其他流控制语句来控制代码块以外,还可以使用Perl语句来控制语句块中的流程。
last语句能够使当前正在运行的最里面的循环块退出。#!/usr/bin/perl $i=0; while ($i<15) { last if ($i==5); $i++; print "$i\n"; }
执行结果:
last 语句能够在$i的值是5时使while循环退出,而不是在通常 while测试的结果是假时退出。当你拥有多个嵌套的循环语句时, last 将退出当前正在运行的循环。
next****语句使得控制权被重新传递给循环的顶部#!/usr/bin/perl for ($i=0;$i<100;$i++) { next if (not $i%2); print "An odd number= $i\n"; }
执行结果:
该循环将输出从 0到98之间的所有奇数。如果 $ i是偶数,那么 next语句将使该循环通过它的下一个迭代运行过程。
标号
Perl允许你给语句块和某些循环语句( for、while)加上标号。也就是说,可以在语句块或语句的前面放置一个标识符:OUTER: while ($expr) { INNER: while($expr) { statement; } }
last、redo和next语句都可以带有一个标号,作为参数,这样就可以退出一个特殊的语句块。
exit语句是最后的一个流控制工具。当perl遇到exit语句时,程序就停止执行,perl将一个退出状态返回给操作系统。
四、列表与数组
1.列表
列表的语法是用一组括号将一些标量值括起来
(5, 'appel', $x, 3.14);
qw运算符,列表每个元素用白空间隔开
qw (5 apple $x 3.14);
范围运算符由一对圆点来表示
#1~10之间的数列 (1..10);
2.数组
#!/usr/bin/perl -w #-w 可以报错 @boy=qw(Greg Peter Bobby); @girl=qw(Marcia Jan Cindy); @kids=(@girl, @boy); print "@kids\n";
执行结果:
从数组中取出元素#!/usr/bin/perl -w @boy=qw(Greg Peter Bobby); print $boy[0];//输出Grep print $boy[1];//输出Peter print $#boy;//输出2 #获得数组的大小 $size=@boy; print $size;//输出3 print scalar(@boy);//输出3
3.遍历数组
#!/usr/bin/perl -w @boy=qw(Greg Peter Bobby); for($index=0;$index<@boy;$index++){ print "My favorite is $boy[$index]\n" }
#!/usr/bin/perl -w @boy=qw(Greg Peter Bobby); foreach $b (@boy){ print "My favorite is $b\n" }
执行结果:
将标量转换成数组的方法之一是使用split函数。
Split函数拥有一个模式和一个标量,并且使用该模式来分割该标量@worlds=split(//,"The quick brown fox");
执行结果:
将数组转换成标量使用join函数
$number=join(',',(1..10));
执行结果:
4.数组排序
sort函数将一个列表作为它的参数,并且大体上按照字母顺序对列表进行排序,然后该函数返回一个排定顺序的新列表。
#!/usr/bin/perl -w @boy=qw(Greg Peter Bobby); print join(' ',sort @boy);
执行结果:
reverse函数能够对字符串的字符进行倒序操作,返回倒序后的字符串。#!/usr/bin/perl -w @boy=qw(Greg Peter Bobby); print join(' ',reverse @boy);
执行结果
五、文件操作
1.打开文件
open函数用于打开文件,句法如下:
open(filehandle,pathname) || die
open函数将文件句柄作为它的第一个参数,将路径名作为第二个参数。路径名用于指明要打开哪个文件。
这一行代码可以读作“打开或撤消”,它有时表示你想要让程序如何处理没有打开的文件。如果 open运行没有成功,也就是说它返回 FALSE,那么逻辑 OR(||)必须计算右边的参数(die);如果open运行成功了,也就是说它返回TRUE,那么就不要计算die的值。
close 函数关闭句柄
当完成文件句柄的操作后,将文件句柄关闭,这是个很好的编程习惯。
打开file.txt文件,当试图打开没有设定目录名的文件名时,Perl假定该文件是在当前目录中。若要打开位于另一个目录中的文件,必须使用路径名。#!/usr/bin/perl -w open(MYFILE, "/home/liuy/Scripts/perl/file.txt") || die close (MYFILE)
特殊变量 $! ,在字符串上下文中,返回来自你的操作系统的相应出错消息。
#!/usr/bin/perl -w open(MYFILE, "/home/liuye/Scripts/perl/file1.txt") || die "$!"; close (MYFILE)
执行结果:
2.读取文件
使用文件输入符 < >
若要读取文件句柄,只需要将文件句柄放入尖括号运算符中,将该值赋予一个变量。#!/usr/bin/perl -w open(MYFILE, "/home/liuye/Scripts/perl/file1.txt") || die "$!"; $line=<MYFILE>; close (MYFILE); print $line;
3.写入文件
open(filehandle,">pathname") //改写 open(filehandle,">>pathname") //追加
写入操作
print filehandel LIST
filehandel是要将数据写入到的文件句柄, LIST是要写入的数据的列表
#!/usr/bin/perl -w open(MYFILE, ">>/home/liuye/Scripts/perl/file.txt") || die "$!"; @contents=qw(this is a cat); print MYFILE @contents; close (MYFILE);
六、模式匹配
简单的模式匹配运算符m/ /
1.元字符
. 圆点用于匹配除了换行符外的任何单个字符 \ 在字符前面加上一个反斜杠,使它失去“元”的含义 + 用于使前面的字符与后面的字符至少匹配一次 * 前面的字符可以进行 0次或多次匹配 ? 用于使前面的字符进行 0次或一次匹配 .* 用来匹配任何东西 {n,m} 根据需要的具体次数进行匹配,n是匹配的最小次数,m是匹配的最大次数 /x{5,10}/ x至少出现5次,但是不超过1 0次 /x{9, }/ x至少出现9次,也可能出现更多次 /x{0,4}/ x最多出现4次,也可能根本不出现 /x{8}/ x必须正好出现8次
2.字符类
若要编写一个字符类,可以用方括号[ ]将这些字符括起来,在字符类中,大多数通配符会失去它们的“通配符性质”,因此,* 实际上代表一个普通的字符。
如果插入记号( ^)作为字符类中的第一个字符,该字符类将变为无效/[^A-Z]/ 匹配不在A-Z的任意字符
3.分组和选择
当可能的匹配项之间用一个 | 字符隔开时,正则表达式中就出现了选择
#这个字符串包含dogs还是cats if (/dogs|cats/) { print "\$_ contains a pet\n"; } 可以对括号进行嵌套,使一个组中包含另一个组 /(fl|b|fl|cl)og/
4.位置通配符
第一个位置通配符是插入记号( ^)
与它相对应的通配符是美元符号( $)5.替换
替换运算符 s / / /
s/search/replace/
6.连接运算符
连接运算符 = ~
如果要对非 $ _的变量使用匹配运算符和替换运算符,则必须将它们与该变量连接起来$weight="185 lbs"; $weight=~s/lbs//;
7.grep函数
grep搜索数组,寻找某些模式
grep不一定必须与模式匹配或替换运算符一道使用,它可以与任何运算符一道使用,下面这个例子用于检索长度超过 8个字符的犬名#!/usr/bin/perl -w @dogs=qw(greyhound blooshound terrier mutt chihuahua); @hounds=grep /hound/, @dogs; @longdogs= grep length($_)>8, @dogs; print "@hounds\n"; print "@longdogs\n";
执行结果:
七、哈希结构
哈希是Perl中的第三种基本数据类型。与数组一样,哈希包含了许多个标量。数组与哈希的差别是:哈希是按照名字来访问它们的标量的,而不是像数组那样使用数字标号进行访问。
哈希元素包含两个部分,即一个关键字和一个值。关键字用于标识哈希的每个元素,而值则是与该关键字相关的数据。这种关系称为关键字值对1.将数据填入哈希结构
哈希变量是以百分比符号(%)来标识的。
若要创建哈希元素,只需要将值赋予这些元素即可,这与创建数组的元素很相似。$food{'apple'}='fruit';//关键字是apple,值是fruit $food{'pear'}='fruit';
P e r l有一个特殊的运算符,称为逗号箭头运算符,即 =>。使用=>运算符,同时利用Perl忽略白空间的特性,就能够编写下面这样的哈希结构的初始化代码。
%food=(key1 => 'value1',key2 => 'value2');
2.从哈希结构中取出数据
key函数来检索作为列表返回的哈希结构的所有关键字。
若要输出该哈希结构中的所有电影名字,可以使用下面的代码:foreach $film (keys %Movies){ print "$film\n"; }
values函数来检索哈希结构中存放的所有值。
foreach $film (values %Movies){ print "$film\n"; }
@Directors=values %Moves; @Films=keys %Moves;
3.列表与哈希结构
若要拷贝一个哈希结构,只需要像下面这样将这个哈希结构赋予另一个哈希结构即可:
%New_Hash=%Old_Hash;
当你将 % Old_Hash置于哈希初始化代码的右边时( Perl通常希望右边是个列表或数组),Perl便将哈希结构转换成一个列表。可以像处理列表那样,将几个哈希结构组合起来并对它进行操作。
%Both=(%First,%Second); %Additional=(%Both,key1 => 'value1',key2 => 'value2' );
4.关于哈希结构的补充说明
exists函数可以用于测试哈希结构中是否存在哈希关键字,如果存在,便返回真,否则返回假。
if (exists $Hash{keyval}) { : }
delete函数删除单个哈希关键字。
delete $Hash{keyval};
若要从哈希结构中删除所有关键字和值,只需要将哈希结构初始化为一个空的列表即可。
%Hash=();
八、函数
在 Perl中,用户定义的函数称为子例程。与 Perl的内置函数一样,用户定义的函数也可以拥有参数,并且可以将值返回给调用者
1.子例程
sub function_name { statement; } #调用子例程 &function (); 或 function ();
子例程的返回值是子例程中计算的最后一个表达式的值,或者是return语句显式返回的值。
2.参数
若要传递子例程的参数,可以使用下面任何一个语句。
subname (arg1, arg2, arg3); &subname (arg1, arg2, arg3); subname arg1, arg2, arg3;
只有当Perl已经遇到子例程的定义时,才能使用上面不带括号的第三种参数形式。
在子例程中,被传递的参数可以通过Perl的特殊变量 @_ 来访问。sub printargs{ print join(',', @_); } printargs('market', 'home', 'roast');
若要像下面这个例子中那样,访问传递过来的各个参数,可以使用数组 @ _上的下标。 $ _ [0] (@_的一个下标)与标量 $ _毫不相干:
sub print_third_argument { print $_[2];//取第三个参数 }
3.作用域
my操作符,使变量成为函数的专用变量。
sub moonweight { my $weight; ($weight)=@_; return ($weight/1.66667); }
Perl语句use strict,它能够激活更严格的 Perl,使你能够避免在编程中出现错误。
总结
参考文献:Perl编程24学时教程
-
perl 脚本语言
2018-02-27 14:05:16perl 脚本语言学习! perl 入门到精通学习。perl 高级脚本语言。 -
perl脚本从入门到大神
2018-01-11 21:19:14无所不能的perl语言,只有你想不到的,没有她不可能实现的,学习perl脚本基从础到深入 -
linux加密perl 脚本工具
2016-12-23 05:05:58linux加密perl 脚本工具