使用“\”通过引用子程序w / o来传递哈希:my_subroutine(%my_hash)

时间:2017-02-11 03:14:26

标签: perl

如何通过引用子例程来传递哈希,而不使用子例程调用表达式中的\字符,如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的其他开发人员设置。

2 个答案:

答案 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;
}