如何通过引用子例程来传递哈希,而不使用子例程调用表达式中的\
字符,如my_subroutine(%my_hash)
?
更多解释:(如果以前的单行问题不够具有描述性)
通过在子程序调用表达式\
中使用my_subroutine($my_var)
字符,通过引用传递变量,可以通过定义子程序来实现:
sub my_subroutine {
my $var_ref = \shift;
...
}
我尝试使用哈希相同的方法,但它无法正常工作:
sub my_subroutine {
my $hash_ref = \shift;
...
}
我认为这是因为perl片段在列表(一维数组)中传入哈希的键值对,即@_
,对于传入的数组也是如此(但仅限于值)没有钥匙)。
我正在寻找一个解决方法来使my_subroutine(%my_hash)
通过参考传递哈希值,而不需要在每次调用子例程时都用反斜杠字符\
在我的子例程参数(哈希)之前。这将有助于使我的主代码看起来更整洁,并让不整洁的内容看到子程序的内部。此外,如果我与一大群开发人员合作,有人可能会忘记添加引用字符。我需要在子例程中设置(哈希总是通过引用my_subroutine传递)而不是由调用my_subroutine的其他开发人员设置。
答案 0 :(得分: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
答案 1 :(得分: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;
}