如何在子例程调用表达式中使用\
字符,如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