0

我讀過perl在執行子節點時使用了引用調用。我做了一個簡單的代碼來檢查此屬性,但它的行爲一樣,如果perl的是個call-by-值:如果perl是通過引用進行調用,爲什麼會發生這種情況?

$x=50; 
$y=70; 

sub interchange { 
    ($x1, $y1) = @_; 

    $z1 = $x1; 
    $x1 = $y1; 
    $y1 = $z1; 

    print "x1:$x1 y1:$y1\n"; 
} 

&interchange ($x, $y); 

print "x:$x y:$y\n"; 

這將產生以下的輸出:

$ perl example.pl 
x1:70 y1:50 
x:50 y:70 

如果論據進行治療一個以引用爲基礎的方式,不應該等於x1而y等於y1?

+2

請使用[strict](http://perldoc.perl.org/strict.html),使用[warnings](http://perldoc.perl.org/warnings。html),請熟悉[詞法作用域變量](http://perldoc.perl.org/perlsub.html#Private-Variables-via-my()),並且不要調用具有前導'&'的子例程[你知道你爲什麼要這樣做,並需要這樣做](http://perldoc.perl.org/perlsub.html#Prototypes)。越快樂,你會越快樂。 :) – pilcrow

+0

此外,還有[更簡單的方法來交換值](http://stackoverflow.com/a/18606254/132382)。 – pilcrow

回答

3

要修改子外部的值,必須修改@_的值。

以下sub interchange修改值:

sub interchange { 
    ($x1, $y1) = @_; # this line copies the values to 2 new variables 

    $z1 = $x1; 
    $x1 = $y1; 
    $y1 = $z1; 

    $_[0] = $x1; # this line added to change value outside sub 
    $_[1] = $y1; # this line added to change value outside sub 

    print "x1:$x1 y1:$y1\n"; 
} 

這使輸出:

x1:70 y1:50 
x:70 y:50 

此處瞭解詳情:http://www.cs.cf.ac.uk/Dave/PERL/node51.html

但是,引用的文章:

您可以看到該函數能夠影響主程序中的@array變量。一般來說,這被認爲是不好的編程習慣,因爲它不會將函數與程序的其餘部分隔離開來。

+3

'sub interchange {@_ [0,1] = @_ [1,0]}' – Borodin

+1

@Borodin我試圖很少改變OP的原始代碼。但很好,簡潔的代碼:) – AntonH

8

Perl總是明確地通過引用來呼叫。您聲明($x1, $y1) = @_複製原始參數值,因爲@_將別名保留爲原始參數。

從perlsub手冊頁:

中顯示出來的數組@_中傳遞的任何參數。因此,如果您使用兩個參數調用函數,那麼這些函數將存儲在$ [0]和$ [1]中。數組@_是一個本地數組,但其元素是實際標量參數的別名。特別是,如果更新元素$ _ [0],則會更新相應的參數(或者如果它不可更新,則會發生錯誤)。

+2

+1迄今爲止最好和最正確的答案。 – pilcrow

-2

我剛剛開始使用Perl,並且我相信您誤解了您傳遞給子例程的內容。當你傳遞$ x和$ y時,你傳遞的是標量$ x和$ y。你需要顯式地傳遞一個引用,這也是一個標量(是唯一允許傳遞給子例程的東西)。我明白你來自哪裏,因爲你需要將引用傳遞給它們,因爲對於數組和哈希來說,思考的東西是逐引用的。

此代碼應該做你要找的內容:

#!/usr/bin/perl 

$x=50; 
$y=70; 

sub interchange { 
    ($x1, $y1) = @_; 

    $z1 = $$x1; # Dereferencing $x1 
    $$x1 = $$y1; # Dereferencing $x1 and $y1 
    $$y1 = $z1; # Dereferencing $y1 

    print "x1:$$x1 y1:$$y1\n"; 
} 

&interchange (\$x, \$y); # Passing references to $x and $y, not their values 

print "x:$x y:$y\n"; 

我傳遞給$ x和$ Y使用\ $ x和\ $ Y引用。然後,我使用$$ x和$$ y在子例程內解引用它們。

相關問題