我有一个更新RSS提要的Perl子例程.我想测试返回的值,但是函数在很多地方使用,所以我想只测试默认变量$_,据我所知,如果没有指定变量,应该指定返回值.
代码有点太长而无法包含所有内容,但实质上它会执行以下操作
sub updateFeed {
#....
if($error) {
return 0;
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
为什么呢
$rtn = updateFeed("My message");
if ($rtn < 1) { &Log("updateFeed Failed with error $rtn"); }
Run Code Online (Sandbox Code Playgroud)
不记录任何错误
而
updateFeed("myMessage");
if ($_ < 1) { &Log("updateFeed Failed with error $_"); }
Run Code Online (Sandbox Code Playgroud)
记录错误" updateFeed Failed with error"?(注意消息末尾没有值.)
谁能告诉我为什么默认变量似乎包含空字符串或undef?
因为Perl不是这样工作的.$_不会自动获取void上下文中调用的函数的结果.有迹象表明,读,写一些内置的运营商$_和@_默认,但你自己的子程序只能这样做,如果你编写代码来做到这一点.
普通函数调用不是$_隐式使用的上下文之一.
这是perldoc perlvar(截至v5.14.1)必须说的$_:
$ _
默认输入和模式搜索空间.以下对是等价的:
while (<>) {...} # equivalent only in while!
while (defined($_ = <>)) {...}
/^Subject:/
$_ =~ /^Subject:/
tr/a-z/A-Z/
$_ =~ tr/a-z/A-Z/
chomp
chomp($_)
Run Code Online (Sandbox Code Playgroud)
以下是Perl假设$ _的地方,即使你不使用它:
以下函数使用$ _作为默认参数:
abs,报警,chomp,印章,chr,chroot,cos,定义,eval,exp,glob,十六进制,int,lc,lcfirst,长度,日志,lstat,mkdir,oct,ord,pos,打印,quotemeta,readlink, readpipe,ref,require,reverse(仅在标量上下文中),rmdir,sin,split(在其第二个参数上),sqrt,stat,study,uc,ucfirst,unlink,unpack.
所有文件测试(
-f,-d)除外-t,默认为STDIN.见-Xperlfunc模式匹配操作
m//,s///以及tr///(也称y///)在没有=~操作员的情况下使用.
foreach如果没有提供其他变量,则循环中的默认迭代器变量.
grep()和map()函数中的隐式迭代器变量.隐含变量
given().当
<FH>操作的结果作为测试的唯一标准进行测试时,放置输入记录的默认位置while.在while测试之外,这不会发生.由于$ _是一个全局变量,这可能会在某些情况下导致不必要的副作用.从perl 5.9.1开始,您现在可以通过在文件或块中声明它来使用词汇版本的$ _
my.此外,声明our $_恢复当前范围内的全局$ _.助记符:在某些操作中理解下划线.