在Perl調試運行這個程序表明$tmp
爲s並將其寫入空字符串,該函數的結果爲defined
。這就是爲什麼設置$a
條件計算結果爲true:
$ perl -d
Loading DB routines from perl5db.pl version 1.33
Editor support available.
Enter h or `h h' for help, or `perldoc perldebug' for more help.
use strict;
use warnings;
my $a = "init";
sub funct{
my $var;
#$var = 1;
return $var if defined $var;
}
my $tmp = funct;
$a = $tmp if defined $tmp;
print "$a\n";
__END__
main::(-:4): my $a = "init";
DB<1> x $a
0 undef
DB<2> n
main::(-:12): my $tmp = funct;
DB<2> x $a
0 'init'
DB<3> x $tmp
0 undef
DB<4> n
main::(-:14): $a = $tmp if defined $tmp;
DB<4> x $tmp
0 ''
要解決,只是return $var
,沒有if defined $var
。這將設置$tmp
爲undef
Thx!總是很高興閱讀這些詳細的答案。由於我是一名新手,由於我所獲得的洞察力,這是值得接受的答案。我喜歡第一個定義,因爲它在直覺上是可以理解的。 – EverythingRightPlace
我喜歡OP比'($ a)= map {$ _? $$ _:()} func(),\ $ a;'或'($ a)= map {defined $ _? $ _:()} func(),$ a;' –
@mpapec這個'map'表達式不一定意味着被使用。相反,它展示了這可以如何推廣。 (實際上,這是Haskell的勢利小人,突出了'Maybe' monad和Perl的標量之間的相似之處。對於monad,我們需要操作'return:t→t?',它由參考運算符'\'和' bind:t?→(t→u?)→u?',可以表示爲'sub bind {my($ x,$ f)= @_; $ x?$ f - >($$ x):我們也有'mzero'('undef')和'mplus:t?→t?→t?',它是'sub mplus {(grep $ _,@_)[ 0 ...}) – amon