为什么我的子例程返回值没有分配给$ _ default变量

Was*_*ssy 3 perl

我有一个更新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?

hob*_*bbs 9

因为Perl不是这样工作的.$_不会自动获取void上下文中调用的函数的结果.有迹象表明,读,写一些内置的运营商$_@_默认,但你自己的子程序只能这样做,如果你编写代码来做到这一点.


Kei*_*son 7

普通函数调用不是$_隐式使用的上下文之一.

这是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 $_恢复当前范围内的全局$ _.

助记符:在某些操作中理解下划线.


ike*_*ami 5

你从未将旗帜分配给$_,为什么它会包含你的旗帜?它似乎包含一个空字符串(或者可能是undef一个带有警告的空字符串字符串).