html tool

显示标签为“perl”的博文。显示所有博文
显示标签为“perl”的博文。显示所有博文

2024年1月16日星期二

转:perl控制小数点输出位数

参考:https://blog.csdn.net/BBka_717/article/details/7480386

 my $var=123.455789;

 $var=sprintf "%.2f",$var;

 print $var."\n";

 #123.46

 默认四舍五入



2024年1月15日星期一

perl 数组便利

 参考:https://perl-book.junmajinlong.com/ch3/5_iterator.html

指针遍历:

while循环或for循环遍历列表时可以获得各元素的索引

可以使用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,使用数组的长度作为条件也一样。

for迭代或foreach迭代列表各元素时,无法获取迭代时元素的索引

一般来说,使用迭代的方式来遍历数组或遍历列表会更方便。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的过程中,自然会发现这一点。


2024年1月14日星期日

perl智能比较符~~

 参考:

https://www.cnblogs.com/softwaretesting/archive/2011/08/06/2129585.html

https://perldoc.perl.org/perlsyn#Switch-statements

数组比较:

判断两个数组所有元素是否相同

通常的做法是,依次比较两个数组对应位置的元素,如果有不相等的元素,立即返回0,如果都相等,则返回1,程序应该是下面的样子。

复制代码
sub test{
for my $i (0 .. $#array1){
if($array1[$i] != $array2[$i]){
return 0 ;
}
}
return 1 ;
}
复制代码

有了智能匹配操作符,可以像下面这样写啦,太简单了!

复制代码
sub test{
if(@array1 ~~ @array2){
return 1 ;
}
else{
return 0 ;
}
}

2024年1月10日星期三

perl-Test:More单独运行指定的testcase

 参考: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:

#! /usr/bin/perl
$ENV{TEST_METHOD} = 'customer_profile';
Test::Class->runtests;

2023年12月27日星期三

cpan(perl)首次使用前配置

 

参考:https://bbs.huaweicloud.com/blogs/313229

第一次执行 cpan 时,需要设置一些配置参数,如下所示。我只展示了下面的重要配置参数。按回车键接受所有默认值。

注意:配置后一定要在cpan提示符下执行“ o conf commit ”保存设置

2023年12月6日星期三

哈哈哈的perl carp异常模块

 参考:https://www.runoob.com/perl/perl-error-handling.html

在看perl的异常模块carp,要笑死pope了;perl的carp模块的语义都是段子手级别的:)

来看看 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


来看看 carp 吹毛求疵 模块 的cluck 唠叨方法

cluck 函数

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 函数

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 函数

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

2023年10月12日星期四

轉:GNU sed extensions are not lookaround assertions

 參考: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


2023年5月6日星期六

解决:“Can't locate Template.pm in @INC”

 问题:

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