请问perl如何比较列表

请问perl如何比较列表

#! /usr/bin/perl -w

my @a = (1,2,3.345);
my ($a1, $a2, $a3) = @a[0,1,2];
$a1 = 0.00001;
if(@a[0,1,2] == ($a1,  $a2,  $a3)) {
        print "ok";
}



我代码这样写的,我预想的要求是如果两个列表每个元素对应都相等,那么列表就相等。

但是实际上上面的代码之比较了列表的最后一个元素。

不知道要比较列表的话该怎么写。
no warnings;

my @foo = ('a'..'e');
my @bar = ('a'..'f');

my @sub_foo = @foo[2..6];
my @sub_bar = @bar[2..6];

my %sub_foo = map {$_, 1} @sub_foo;
my @diff = grep {!$sub_foo{$_}} @sub_bar;

print "ok\n" unless defined @diff;


http://search.cpan.org/dist/List-Compare/lib/List/Compare.pm
没必要构造 hash 了,直接一个 foreach 循环就可以了。


QUOTE:
原帖由 oyd_admin 于 2009-1-10 20:47 发表
#! /usr/bin/perl -w

my @a = (1,2,3.345);
my ($a1, $a2, $a3) = @a[0,1,2];
$a1 = 0.00001;
if(@a[0,1,2] == ($a1,  $a2,  $a3)) {

== 给其 operand 提供了 scalar context,而它的左边 @a[0,1,2] 是 array @a 的 slice,是个 list,同样 ($a1, $a2, $a3) 也是个 list,而在 scalar context 中,list 返回的是它的最后一个元素。

BTW,在 scalar context 中, ($a1, $a2, $a3) 也可看作是 comma operator 连接的几个 scalar value,此时它也返回最后一个表达式的值。

详见 perldata 的 Slices 和 List value constructors, perlop 对 == 的描述.


QUOTE:
原帖由 撒哈拉里的鱼 于 2009-1-10 21:42 发表
http://search.cpan.org/dist/List-Compare/lib/List/Compare.pm

除了这个,还有其他一些模块也可实现类似甚至更复杂的功能。例如 Test::Deep