2017-02-11 80 views
0

如何在子例程調用表達式中使用\字符,如my_subroutine(%my_hash),如何通過引用子例程來傳遞散列?通過使用「」引用子例程的散列來傳遞散列:my_subroutine(%my_hash)


更多解釋(如果先前的單行的問題是不足夠的描述)

傳遞變量參照的子程序,而不在子程序調用表達式使用\字符

sub my_subroutine { 
    my $var_ref = \shift; 
    ... 
} 

我曾嘗試相同的:等my_subroutine($my_var)可以通過定義子程序作爲這樣來實現與哈希方法,但它不能正常工作:

sub my_subroutine { 
    my $hash_ref = \shift; 
    ... 
} 

我認爲這是因爲Perl片段任何哈希鍵 - 值對傳入列表(一維數組),這是@_,也同樣是用傳入的數組完成(但值僅用於鍵)。

我正在尋找在解決類似的問題,使通過參考my_subroutine(%my_hash)通散而不需要通過我每次調用子程序時反斜槓字符\先於我的子程序參數(哈希值)。這將有助於使我的主代碼看起來更整潔,並使子程序內部看起來不整齊。另外,如果我與一大羣開發人員合作,有人可能會忘記添加引用字符。我需要在子例程中設置它(散列總是通過引用my_subroutine傳遞),而不是由其他調用my_subroutine的開發人員設置。

+0

Re「*我認爲這是因爲... *」,唯一可以傳遞給subs(以及從subs返回的)是一些標量。您在執行'my_subroutine(%my_hash)'時傳遞的標量包含密鑰的副本和散列的(實際非複製)值。 (原型可以影響通過哪個標量。) – ikegami

+0

Re * *通過引用傳遞變量而不使用'\'字符... *「,變量總是[傳遞* *引用](http://在Perl中(這就是爲什麼'我的$ var_ref = \ shift;'可以得到一個引用的原因(stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-passing-by-value)到它)。在調用方使用'\'傳遞* a *引用(當然,這是通過引用傳遞的)。 – ikegami

+2

*「這將有助於使我的主代碼更整潔」*這也會誤導實際發生的事情。如果那是你唯一的目標,那麼就忘記它。 – Borodin

回答

5

Prototypes may still considered bad,但此處您可以用它們來實現自己的目標。

sub my_subroutine (\%) { 
    my $hashref = shift; 
    ... 
} 

my_subroutine(%hash); 

通過原型,子例程的第一個參數被強制爲散列引用。

請注意,在子例程中,散列是作爲散列引用接收的。您還需要使用命名的哈希來調用子例程。

my_subroutine({ "anonymous" => "hash", "not" => "OK" }); # not OK with proto 
+2

優秀的湯姆克里斯琴森(Tom Christiansen)看看[* Prototypes Considered Harmful *](http://www.perlmonks.org/?node_id=861966)。我認爲向大概是初學者的OP暗示,使用原型子程序是可以的,這樣他們就不必在反向參數中加反斜槓。 – Borodin

0

怎麼是這樣的:

#!/usr/bin/perl 
use warnings; 
use strict; 
use Data::Printer; 

my %h1 = (a => 10, b => 20); 
mySub(%h1); 

sub mySub { 
    my ($h1) = {@_}; 
    p $h1; 
} 
+0

有什麼問題。它不支持編輯傳入的散列。請檢查我的測試代碼[這裏](https://gist.github.com/omarabdelsalam/2e238f24ae9961a984a9a40e97fe7439)。 – Omar

+1

@Omar這是因爲{@_}將'@ _'的內容複製到新的匿名哈希中。您將無法使用此方法修改原始哈希值。 – ThisSuitIsBlackNot

+0

在這種情況下,您必須使用原型(並確保在使用它之前定義該子)。請檢查您的要點回復 –