今天看到了在參數中傳遞引用的一段文章,其中講到了一個問題,自己以前還碰到過,不過最後是通過其他辦法繞過去了。
今天看到這個問題可以通過傳遞參數引用來解決。所以打算寫下來。希望可以幫到大家。
我就直接引用這本書中的例子了。
就是如果我們在參數中傳遞兩個數組的時候,會出現一些問題。
sub getarrays{
my(@a,@b) = @_;
.
.
}
@fruit = qw(apples oranges banana);
@veggies = qw(carrot cabbage turnip);
getarrays(@fruit, @veggies);
上面這段代碼我們預期 @fruit 會賦值給@a,@veggies賦值給@b,但其實結果不是那樣的。
在調用getarrays(@fruit, @veggies)的時候,其把參數@fruit 和 @veggies壓縮到單個數組@_中。
這樣在getarrays函數內部,就會把@_賦值給@a,即就是@fruit和@veggies都賦值給@a了。
我們根本無法知道一個數組何時結束 以及下一個數組何時開始,因為我們只知道@_.
這時傳遞參數引用可以很好的解決這個問題。即我們沒有必要傳遞整個數組,只要傳遞相關數組的引用就可以了。
sub getarrays{
my($fruit_ref,$veg_ref) = @_;
.
.
}
@fruit = qw(apples oranges banana);
@veggies = qw(carrot cabbage turnip);
getarrays(/@fruit, /@veggies);
函數getarrays()總是接收兩個值,即兩個引用,無論這些引用指向的數組有多長。這時,
$fruit_ref和$veg_ref可以用來顯示或編輯資料,如下所示:
sub getarrays{
my($fruit_ref,$veg_ref) = @_;
print "Fruit:" ,join(',', @$fruit_ref);
print "Veggies:",join(',', @veggies_ref);
}
當你將對標量、數組或雜湊結構的引用作為參數傳遞給函數時,有幾個問題必須記住。
當你傳遞引用時,函數能夠對引用指向的未經處理資料進行操作
所以在使用引用的時候我們應該注意這一點。