参考:https://blog.csdn.net/BBka_717/article/details/7480386
例
my $var=123.455789;
$var=sprintf "%.2f",$var;
print $var."\n";
#123.46
默认四舍五入
参考:https://perl-book.junmajinlong.com/ch3/5_iterator.html
指针遍历:
可以使用while循环或for循环的方式来遍历所有元素:
my @arr = qw(a b c d e f);
# while
my $i = 0;
while($i <= $#arr){
say "index: $i, value: $arr[$i]";
$i++;
}
# for
for(my $i=0;$i<=$#arr;$i++){
say "index: $i, value: $arr[$i]";
}
上面的while和for循环利用的是数组的最大索引$#arr,使用数组的长度作为条件也一样。
一般来说,使用迭代的方式来遍历数组或遍历列表会更方便。Perl中可以使用for或foreach进行迭代,foreach是for的语法糖,foreach能做的,for都能做。
for或foreach的迭代数组或列表的方式如下。
my @arr = qw(a b c d e f);
# for
for my $v (@arr) {
say "value: $v";
}
# foreach
foreach my $v (@arr) {
say "value: $v";
}
for或foreach迭代时,会从列表中逐个取元素,取一个元素,赋值给迭代控制变量$v,然后执行一次循环体,再继续取下一个元素。
注意,迭代每个列表元素时,元素是按引用传递给控制变量的,控制变量在栈中保存了元素的内存地址,每次迭代时控制变量的地址都发生改变。因此可以推断,每次迭代时,Perl都会重新声明控制变量,每次声明的控制变量仅在本次迭代过程中有效。
my @arr = (11, 22, 33, 44);
my $v = 3333;
say \$v;
say '---- before ----';
for my $v (@arr) { say \$v; }
say '---- after ----';
say \$v;
say "$v";
# 输出:
# SCALAR(0x22f3d10)
# ---- before ----
# SCALAR(0x2277ab0)
# SCALAR(0x2277a98)
# SCALAR(0x2277b40)
# SCALAR(0x2277b58)
# ---- after ----
# SCALAR(0x22f3d10)
# 3333
因此,for或foreach迭代时,赋值过程大致如下图:

因此,如果在循环体内修改控制变量,也将直接修改列表中该元素的值。
my @arr = (11, 22, 33, 44);
for my $v (@arr) {
$v++;
}
say "@arr"; # 输出:12 23 34 45
在使用for/foreach迭代数组时要注意,修改数组大小会影响迭代。
my @arr = (11,22,33,44,55,66);
for my $i (@arr){
shift @arr;
say $i; # 11 33 55
}
for和foreach迭代时需指定控制变量,例如for $i (...)。
控制变量是可以省略的,此时将使用Perl的默认标量变量$_。
下面两条for迭代语句完全等价:
for(11,22,33){ say $_; }
for $_ (11,22,33) { say $_; }
Perl的很多操作都允许省略操作目标,此时将使用默认变量$_作为这些操作的操作目标。以后在使用Perl的过程中,自然会发现这一点。
参考:
https://www.cnblogs.com/softwaretesting/archive/2011/08/06/2129585.html
https://perldoc.perl.org/perlsyn#Switch-statements
数组比较:
通常的做法是,依次比较两个数组对应位置的元素,如果有不相等的元素,立即返回0,如果都相等,则返回1,程序应该是下面的样子。
有了智能匹配操作符,可以像下面这样写啦,太简单了!
参考:https://metacpan.org/pod/Test::Class#TO-DO-TESTS
[popexizhi: 这里有个问题 环境变量 TEST_METHOD , 如果拼写错误是不会报错的只是没有正常执行,注意!]
Sometimes you just want to run a single test. Commenting out other tests or writing code to skip them can be a hassle, so you can specify the TEST_METHOD environment variable. The value is expected to be a valid regular expression and, if present, only runs test methods whose names match the regular expression. Startup, setup, teardown and shutdown tests will still be run.
One easy way of doing this is by specifying the environment variable before the runtests method is called.
Running a test named customer_profile:
参考:https://www.runoob.com/perl/perl-error-handling.html
在看perl的异常模块carp,要笑死pope了;perl的carp模块的语义都是段子手级别的:)
来看看 carp 吹毛求疵 模块 的carp 吹毛求疵方法
carp函数可以输出程序的跟踪信息,类似于 warn 函数,通常会将该信息发送到 STDERR:
package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; sub function { carp "Error in module!"; } 1;
在脚本调用以下程序:
use T; function();
执行以上程序,输出结果为:【popexizhi: 我crap 吹毛求刺,我只提供抱怨:)】
Error in module! at test.pl line 4
cluck() 与 warn() 类似,提供了从产生错误处的栈回溯追踪。
package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp qw(cluck); sub function { cluck "Error in module!"; } 1;
在脚本调用以下程序:
use T; function();
执行以上程序,输出结果为:【popexizhi:我cluck 咯咯声,啧啧声,关心的唠叨,就要说出全部栈,比carp的吹毛求疵多了上下文哈:)】
Error in module! at T.pm line 9 T::function() called at test.pl line 4
来看看 carp 吹毛求疵 模块 的croak 死亡前的嘶哑说话 方法(好吧,和die的还真是关系)
croak() 与 die() 一样,可以结束脚本。
package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; sub function { croak "Error in module!"; } 1;
在脚本调用以下程序:
use T; function();
执行以上程序,输出结果为:【popexizhi:我croak 死前的嘶哑,就说出死了位置就不错了哈:),不要强求;问题是这个croak死去呻吟 与carp 的吹毛求疵 好像 是一样的内容啊?!那die前的croak 嘶哑说 和吹毛求疵 的carp 是没有区别吗?】
Error in module! at test.pl line 4
来看看 carp 吹毛求疵 模块 的 confess忏悔方法 (好吧,这个是die前的忏悔吧有时间,所以多说哈:))
confess() 与 die() 类似,但提供了从产生错误处的栈回溯追踪。
package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; sub function { confess "Error in module!"; } 1;
在脚本调用以下程序:
use T; function();
执行以上程序,输出结果为:【popexizhi: 这个confess 忏悔多了栈信息,和之前的croak 与carp 的问题相同;这个忏悔的confess 与 唠叨的cluck 有什么区别呢?难道 唠叨cluck 就是忏悔confess吗?:)】
Error in module! at T.pm line 9 T::function() called at test.pl line 4
參考:https://stackoverflow.com/questions/26110266/does-lookbehind-work-in-sed
問題:
將如下中的|!|! 替換為 |!@|!
19cdef1cf7ea02fa627281853ea2e1b2d27303e028906bffd755f0f56|!unknown|!Clean|!|!|!|!api_apit
而使用正向搜索後無效果,如下:
# cat l|sed 's/|!(?=|!)/|!@/g'
e39999219cdef1cf7ea02fa627281853ea2e1b2d27303e028906bffd755f0f56|!unknown|!Clean|!|!|!|!api_apit
查詢原因為:
GNU sed does not have support for lookaround assertions. You could use a more powerful language such as Perl or possibly experiment with ssed which supports Perl-style regular expressions.
perl -pe 's/(?<=foo)bar/test/g' file.txt
修改為perl後,可以如下:# cat l|perl -pe 's/\|!(?=\|!)/\|!@/g' e39999219cdef1cf7ea02fa627281853ea2e1b2d27303e028906bffd755f0f56|!unknown|!Clean|!@|!@|!@|!api_apit
问题:
tsung 生成报告时一直提示“Can't locate Template.pm in @INC”
解决:
sudo yum install cpan
sudo cpan install Template
参考:https://forums.cpanel.net/threads/cant-locate-template-pm.68820/
【popexizhi:
https://blog.csdn.net/whatday/article/details/122251716
CPAN(Comprehensive Perl Archive Network:全面的Perl存档网络)是查找任何Perl有关的东西的中心仓库。
它包含从整个Perl社区收集来的智慧:成百上千的 Perl模块和脚本,相当于好几本书的文档,以及整个Perl发布。
相当于python的pip
】