[英]Perl map passing arguments
我正在嘗試使用我自己的子程序map()。 當我使用Perl的內置函數嘗試它時,它可以工作。 但是當我用自己的子程序嘗試map()時,它失敗了。 我無法指出導致錯誤的原因。
這是代碼片段。
#!/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";
Map始終將參數列表的元素分配給$_
,然后計算表達式。 因此map mysqr($_), 1,2,3,4,5
在每個元素1,2,3,4,5上調用mysqr
,因為$_
設置為1,2,3,4中的每一個, 5反過來。
你可以在調用內置函數時經常省略$_
的原因是,如果沒有給出參數,許多Perl內置函數默認會在$_
上運行。 例如, 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
區別在於,在第二種情況下,您顯式傳遞參數,而在第一種情況下,您不傳遞任何內容。
@answers = map(mysqr, @questions); # same as mysqr(), no argument passed
@answers = map {mysqr($_)} @questions; # $_ is passed on to $input
您可能會想到許多Perl內置函數在沒有給出參數時使用$_
這一事實。 但是,這不是用戶定義的子例程的默認行為。 如果您需要該功能,則需要自己添加。 雖然被警告說這通常不是一個好主意。
請注意,如果您使用始終應該use warnings
,則會出現描述性錯誤:
Use of uninitialized value $input in multiplication (*) at foo.pl line 8.
這告訴您沒有數據傳遞給$input
。
不使用警告不是從代碼中刪除錯誤,它只是隱藏它們,就像隱藏汽車中的“低油”警告燈不會阻止引擎故障。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.