1

我认为这个 Perl 应该产生 ['c', undef] 但在 Windows 7、ActiveState 5.16 上它会产生:[]。

#-----------------------------------------------------------------------
# Test List::Pairwise
#-----------------------------------------------------------------------

use v5.16;
use Data::Dump qw(dump);
use List::Pairwise qw(grepp mapp);
use Win32;

my $a = qr(\d+)x;
my $b = qr($a \. $a)x;

my %k = (a=>1, b=>2, c=>undef);
say dump([grepp {!$b} %k]);
say Win32::GetOSName();
say qx(perl -v);

产生:

[]
Win7Home Premium (64-bit)

This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x64-multi-thread
(with 1 registered patch, see perl -V for more detail)
4

2 回答 2

2

你不能词汇化变量$a$bwith myor 他们失去他们的魔力。$a并且$b实际上是特殊的包变量,不需要声明就可以在函数中使用它们,例如sortor List::Pairwise::mapp。如果您确实声明了它们,任何依赖它们的函数都不会按预期工作。

于 2013-09-11T21:26:29.410 回答
2

List::Pairwise 设置变量$a$b在调用者的包中。

通过使用my $b,您告诉您的回调访问该词法变量$::b

除了删除之外my $b,您还可以使用变量的全名或创建词法指令来访问包变量。

grepp { !$::b } %k

grepp { our $b; !$b } %k

grepp { !our $b } %k
于 2013-09-11T23:27:47.493 回答