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


==

posted on 2011-10-13 10:20  perlman  阅读(924)  评论(0编辑  收藏  举报

导航