Perl映射传递参数
我正在用自己的子程序尝试map()。当我尝试使用Perl的内置函数时,它是有效的。但当我用自己的子例程尝试map()时,它失败了。 我无法指出错误的原因 下面是代码片段Perl映射传递参数,perl,map,Perl,Map,我正在用自己的子程序尝试map()。当我尝试使用Perl的内置函数时,它是有效的。但当我用自己的子例程尝试map()时,它失败了。 我无法指出错误的原因 下面是代码片段 #!/usr/bin/perl use strict; sub mysqr { my ($input) = @_; my $answer = $input * $input; return $answer; } my @questions = (1,2,3
#!/usr/bin/perl
use strict;
sub mysqr {
my ($input) = @_;
my $answer = $input * $input;
return $answer;
}
my @questions = (1,2,3,4,5);
my @answers;
@answers = map(mysqr, @questions); # doesn't work.
@answers = map {mysqr($_)} @questions; #works.
print "map = ";
print join(", ", @answers);
print "\n";
区别在于,在第二种情况下,您显式地传递参数,而在第一种情况下,您什么也不传递
@answers = map(mysqr, @questions); # same as mysqr(), no argument passed
@answers = map {mysqr($_)} @questions; # $_ is passed on to $input
您可能会想到这样一个事实,即许多Perl内置函数在没有给出参数的情况下使用$\uuuu
。然而,这不是用户定义的子例程的默认行为。如果您想要这个功能,您需要自己添加它。不过,我要提醒你,这通常不是一个好主意
请注意,如果使用始终应该使用的使用警告,则会出现描述性错误:
Use of uninitialized value $input in multiplication (*) at foo.pl line 8.
它告诉您没有数据被传递到$input
不使用警告并不是从代码中删除错误,它只是隐藏错误,就像在汽车中隐藏“低机油”警告灯并不能防止发动机故障一样。Map始终将参数列表的一个元素指定给$\uucode>,然后计算表达式。因此,map mysqr($)、1,2,3,4,5
对元素1,2,3,4,5中的每一个调用mysqr
,因为$依次设置为1,2,3,4,5中的每一个
调用内置函数时,您经常可以忽略$\uuu
的原因是,许多Perl内置函数如果没有给定参数,默认情况下将在$\uu
上运行。例如,lc
函数就是这样做的。您的mysqr
函数不会执行此操作,但如果您将其更改为执行此操作,则第一个表单将起作用:
sub mysqr {
my $input;
if (@_) { ($input) = @_ }
else { $input = $_ } # No argument was given, so default to $_
my $answer = $input * $input;
return $answer;
}
map(mysqr, 1,2,3,4,5); # works now
使用$
,而不是$
和$input
。或者,你可以抓住原型这把双刃剑,编写子mysqr({my($input)=@;…}
,在这种情况下可能更可取。更可取的解决方案是死“mysqr:没有给出参数”,除非@在我看来,这真的取决于你想要什么代码>也有可能,因为他们说,有不止一种方法可以做到这一点。@microbe不客气。我给你的建议是:不要使用默认使用$的解决方案。它会以微妙的方式从背后咬你。总是通过争论。