2013-06-18 47 views
8

我有一個小問題。我正在閱讀一些代碼,因爲我的學校沒有教我任何關於Perl編程的有用的東西,所以我在這裏問你一些人。我看這條線被使用了很多在一些Perl程序:使用特殊字符的Perl&

$variable = &something(); 

我不知道是什麼牌子&這裏指我從來沒有說在Perl。而something是一個子程序(我猜測)。它通常會說一個名字,有時它也有一個類似於函數的參數。有人能告訴我&代表什麼,something是什麼。

該變量需要某種返回的值,然後用於檢查一些條件,這使我認爲這是一個子例程。但仍然爲什麼&

感謝

回答

14

在舊版本的Perl &的被用來調用子程序。現在,這是沒有必要的,\&主要用於採取reference到子程序,

my $sub_ref = \&subroutine; 

或忽略函數原型(http://perldoc.perl.org/perlsub.html#Prototypes

比引用子程序&其他爲bitwise and操作,

http://perldoc.perl.org/perlop.html#Bitwise-And

+0

哦,所以如果我將其更改爲不帶和標誌,它仍然會工作嗎? – ban

+1

是的,它仍然有效。 –

+0

好的。所以我無法找到它指向的功能。它必須在其他文件中。但你能告訴我他們是如何從另一個文件中調用一個函數而不使用包的東西:package :: sub() – ban

27

幾乎每次看到&以外的\&fooEXRP && EXPR,這是一個錯誤。


  • &foo(...)是相同,除了foo的原型foo(...)將被忽略。

    sub foo(&@) { ... }  # Cause foo to takes a BLOCK as its first arg 
    
    foo { ... } ...; 
    &foo(sub { ... }, ...); # Same thing. 
    

    只有子程序(不是操作員)將被&foo(...)調用。

    sub print { ... } 
    print(...);   # Calls the print builtin 
    &print(...);  # Calls the print sub. 
    

    在您的整個編程生涯中,您可能不需要使用此功能。如果你看到它的使用,肯定有人在不應該使用&時。

  • &foo&foo(@_)相似。區別在於對foo@_的更改會影響當前子版本的@_

    您可能永遠不需要在整個編程生涯中使用此功能。如果你看到它的使用,肯定會有人使用&當他們不應該或愚蠢的嘗試優化。但是,以下是非常優雅:

    sub log_info { unshift @_, 'info'; &log } 
    sub log_warn { unshift @_, 'warn'; &log } 
    sub log_error { unshift @_, 'error'; &log } 
    
  • goto &foo類似於&foo,除了當前子程序從調用堆棧首先刪除。例如,這會導致它不會顯示在堆棧軌跡中。

    您可能永遠不需要在整個編程生涯中使用此功能。如果你看到它的使用,這肯定是一個愚蠢的嘗試優化。

    sub log_info { unshift @_, 'info'; goto &log; } # These are slower than 
    sub log_warn { unshift @_, 'warn'; goto &log; } # not using goto, but maybe 
    sub log_error { unshift @_, 'error'; goto &log; } # maybe log uses caller()? 
    
  • $&包含的最後一個正則表達式匹配匹配的部分。在5.20之前,使用這個會導致整個解釋器中的每個正則表達式變慢(如果它們沒有捕獲),所以不要使用它。

    print $&  if /fo+/;  # Bad before 5.20 
    print $MATCH if /fo+/;  # Bad (Same thing. Requires "use English;") 
    print ${^MATCH} if /fo+/p; # Ok (Requires Perl 5.10) 
    print $1  if /(fo+)/; # Ok 
    
  • defined &foo是檢查是否存在子程序的完全合法的方式,但它不是你可能永遠需要的東西。還有exists &foo是相似的,但沒有那麼有用。

  • EXPR & EXPR是按位AND運算符。這是在處理將多個信息存儲在一個單詞中的低級系統時使用的。

    system($cmd); 
    die "Can't execute command: $!\n"  if $? == -1; 
    die "Child kill by ".($? & 0x7F)."\n" if $? & 0x7F; 
    die "Child exited with ".($? >> 8)."\n" if $? >> 8; 
    
  • &{ EXPR }()(和&$ref())是通過參考一個子程序調用。儘管我更喜歡$ref->()語法,但這是一個完全可以接受的並且有點常見的事情。下一個項目中的示例。

  • \&foo需要參考子程序foo。這是一個完全可以接受的並且有點常見的事情。

    my %dispatch = (
        foo => \&foo, 
        bar => \&bar, 
    ); 
    
    my $handler = $dispatch{$cmd} or die; 
    $handler->(); 
    # Same: &{ $handler }(); 
    # Same: &$handler(); 
    
  • EXPR && EXPR是布爾AND運算符。我相信你對這個非常普通的操作員很熟悉。

    if (0 <= $x && $x <= 100) { ... } 
    
+0

忘記了按位和布爾AND。添加。 – ikegami

+0

非常感謝你......這是一個答案中的很多信息 – ban

+0

@ikegami ...不要離開我們! –