如何在子例程調用表達式中使用\
字符,如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的開發人員設置。
Re「*我認爲這是因爲... *」,唯一可以傳遞給subs(以及從subs返回的)是一些標量。您在執行'my_subroutine(%my_hash)'時傳遞的標量包含密鑰的副本和散列的(實際非複製)值。 (原型可以影響通過哪個標量。) – ikegami
Re * *通過引用傳遞變量而不使用'\'字符... *「,變量總是[傳遞* *引用](http://在Perl中(這就是爲什麼'我的$ var_ref = \ shift;'可以得到一個引用的原因(stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-passing-by-value)到它)。在調用方使用'\'傳遞* a *引用(當然,這是通過引用傳遞的)。 – ikegami
*「這將有助於使我的主代碼更整潔」*這也會誤導實際發生的事情。如果那是你唯一的目標,那麼就忘記它。 – Borodin