Perl中的特殊變數

來源:互聯網
上載者:User
Perl中的特殊變數

1. $&, $`,$' 用在模式比對中

$&  用來存放匹配中的值
$`   用來存放匹配中之前所有字元
$
'   用來存放匹配中之後所有字元

如:
#!/usr/bin/perl -w
if( " Hello good  there,neigbor hello " =~ /S(w+),/)
{
        print  " That actually matched '$&'.  ";
        print $`. "   ";
        print $ ' ." ";
}

執行的結果為:

That actually matched 
'there,'.
Hello good  
neigbor hello

----------------------------------------------
另外常用的變數@_
@_是子程式的一個私人變數◆;如果有一個全域變數@_,它將在此子程式調用前儲存起來,當子程式調用完成後,其早期的值會被重新賦還給@_◆。這意味著當將參數傳遞給子程式時不用擔心它會影響此程式中其它子程式的@_這個變數的值。嵌套的子程式調用時,@_的值和上述類似。甚至此子程式遞迴調用時,每一次調用將得到新的@_,因此子程式調用時將得到其自身的參數列表。

◆除非調用的子程式前有&而後面沒有括弧(或者沒有參數),此時@_從此調用者的上下文(context)得到。這通常不是個好主意,但有時很
有用。

2. Perl - $_ and @_

Perl's a great language for special variables - variables that are set up without the programmer having to intervene and providing information ranging from the number of lines read from the  current input file ($.) through the  current process ID ($$) and the  operating system ($^O). Other special variables effect how certain operations 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,  chop s (and  lc s and many more) without a parameter, and even  print s 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 refer to the special variables by other longer, but easier to remember, names such 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. 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.