如何通过引用将散列传递给子例程,而不使用像\这样的子例程调用表达式中的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的其他开发人员。
发布于 2017-02-11 03:34:21
Prototypes may still considered bad,但您可以在这里使用它们来实现您的目标。
sub my_subroutine (\%) {
my $hashref = shift;
...
}
my_subroutine(%hash);对于原型,子例程的第一个参数被强制为散列引用。
注意,在子例程中,哈希作为哈希引用接收。您还需要使用命名的散列调用子例程。
my_subroutine( { "anonymous" => "hash", "not" => "OK" } ); # not OK with proto发布于 2017-02-11 03:26:58
像这样的事怎么样:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Printer;
my %h1 = ( a => 10, b => 20);
mySub(%h1);
sub mySub {
my ($h1) = {@_};
p $h1;
}https://stackoverflow.com/questions/42171774
复制相似问题