Perl语言中的 $_ 和 @_

来源:互联网 发布:淘宝大尺度未处理晒单 编辑:程序博客网 时间:2024/06/04 00:45
Perl - $_ and @_
Perl's a great language for special variables- variables that are set up without the programmer having to interveneand providing information ranging from the number of lines read fromthe current input file ($.) through the current process ID ($$) and theoperating system ($^O). Other special variables effect how certainoperations are performed ($| controlling output buffering / flushing,for example), or are fundamental in the operation of certain facilities- no more so than $_ and @_.

Lets clear a misconception. $_ and @_ are different variables. In Perl, you can have a list and a scalar of the same name, and they refer to unrelated pieces of memory.

$_ is known as the "default input and pattern matching space". In other words, if you read in from a file handle at the top of a while loop, or run a foreach loop and don't name a loop variable, $_ is set up for you. Then any regular expression matches, chops (and lcs and many more) without a parameter, and even prints assume you want to work on $_. Thus:
while ($line = <FH>) {
  if ($line =~ /Perl/) {
    print FHO $line;
    }
  print uc $line;
  }


Shortens to:
while (<FH>) {
  /Perl/ and
    print FHO ;
  print uc;
  }


@_ is the list of incoming parameters to a sub. So if you write a sub, you refer to the first parameter in it as $_[0], the second parameter as $_[1] and so on. And you can refer to $_# as the index number of the last parameter:
sub demo {
  print "Called with ",$#_+1," params/n";
  print "First param was $_[0]/n";


Note that the English module adds in the ability to referto the special variables by other longer, but easier to remember, namessuch as @ARG for @_ and $PID for $$. But use English; can have a detrimental performance effect if you're matching regular expressions against long incoming strings.