perl杂项
不好分类的暂时都放到这里
判断两个数组所有元素是否相同
直接比较数组名字即可,不必逐个元素比较。
my @a = (1..10) ;
my @b = (1..10) ;
if (@a == @b) {
print "equal\n" ; #equal
}
但需要注意一点,如果是数组的引用,那么就不能直接比较了。必须先解引用再比较。
my $aref1 = [1..10] ;
my $aref2 = [1..10] ;
if ($aref1 == $aref2) {
print "equal\n" # not equal
}
先解引用再比较
my $aref1 = [1..10] ;
my $aref2 = [1..10] ;
if (@$aref1 == @$aref2) {
print "equal\n" ; # equal
}
打印数组
最笨的方法,多半来自其他语言比较熟悉的coder们。其中$#numbers表示数组numbers的最后一个元素的下标。在这里时9,所有要使用<=,而不是<,否则会漏掉最后一个元素。
my @numbers = (1..10);
for (my $i =0; $i <= $#numbers; ++$i) {
print $numbers[$i], "\n";
}
其实普通数组直接打印即可,无需遍历。
my @a = (1..10) ;
print @a ;
需要注意,定义数组和哈希都使用圆括弧(),定义匿名数组用方括弧[],定义匿名哈希用花括弧{}。如果不小心把()写成了[],那么结果可能很奇怪,比如
my @b = [1..10] ;
print @b ; #输出 ARRAY(0x248bec)
为什么呢?因为=右边是[],实际上定义了一个匿名数组,但是=左边并非引用变量(引用变量需以$开头),而是数组,这就导致了将匿名数组的引用放入了数组b中,也就是说数组b只有一个元素,这个元素是指向匿名数组[1..10]的引用,所以下面两句产生同样的结果。
print @b ;
print $b[0] ;
一个小结论:当数组只有一个元素的时候。print @array和print $array[0]的结果是相同的。有了这个结论,就不难想通上面两句为什么相同了。
判断某元素是否在数组中
方法一
直接遍历数组,逐个元素判断。
方法二
是用grep
my @Colors= (
'Red',
'Green',
'Yellow',
);
if (grep {$_ eq 'Red'} @Colors) {
print "Exists!\n";
}
}
方法三
如果是perl 5.10.0以上,可以使用智能匹配,如下。
my @array = (1, 2, 3, 4, 5) ;
my $var = 2 ;
if( $var ~~ @array) {
print "$var exists in (@array)\n" ;
}
定义空列表
定义空列表用(),而不是undef
下面代码输出1,这种写法表示列表的第一个元素是undef.严格的说并不是空列表。
my @list = undef;
push @list, 1 ;
push @list, 2 ;
print $list[1], "\n" ; # Output 1
下面代码输出2
my @list = ();
push @list, 1 ;
push @list, 2 ;
print $list[1], "\n" ; # Output 2
unless(xxx) 与 unless defined(xxx)
这两者是不一样的,前者表示xxx为假的时候执行代码,而后者表示xxx未定义时执行代码,也就是只有当xxx==undef时,后者才会执行,而前者以下几种情况都会执行的。
xxx==undef
xxx=0
xxx='0'
xxx=''
xxx=""
将数组元素分组
有一个数组含100个元素,请将每10个元素分为一组,分成10组,保存到一个新的数组中。
my @a = (1..100);
my @b = map { join '',@a[$_..$_+9] } map { $_ * 10 } 0..9;
或者
my @a = (1..100);
my @b = map { join '',@a[$_..$_+9] } map { $_ * 10 } 0..9;
来自CU
==