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

Oma*_*mar 0 perl

我如何通过引用子例程来传递哈希,而不使用\子例程调用表达式中的字符my_subroutine(%my_hash)


更多解释 :( 如果以前的单行问题不够具有描述性)

通过引用变量通过引用子例程而不使用\子例程调用表达式中的字符,my_subroutine($my_var)可以通过定义子例程来实现:

sub my_subroutine {
    my $var_ref = \shift;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我已尝试使用哈希相同的方法,但它无法正常工作:

sub my_subroutine {
    my $hash_ref = \shift;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我认为这是因为perl片段在列表(一维数组)中传递哈希的键 - 值对,这@_也与传入的数组相同(但是对于不使用键的值).

我正在寻找一个解决方法,使得每次调用子程序时都my_subroutine(%my_hash)需要通过反斜杠字符在我的子程序参数(哈希)之前进行传递哈希引用\.这将有助于使我的主代码看起来更整洁,并让不整洁的内容看到子程序的内部.此外,如果我与一大群开发人员合作,有人可能会忘记添加引用字符.我需要在子例程中设置(哈希总是通过引用my_subroutine传递)而不是由调用my_subroutine的其他开发人员设置.

mob*_*mob 5

原型可能仍然被认为是坏的,但您可以在这里使用它们来实现您的目标.

sub my_subroutine (\%) {
    my $hashref = shift;
    ...
}

my_subroutine(%hash);
Run Code Online (Sandbox Code Playgroud)

使用原型,子例程的第一个参数被强制为哈希引用.

请注意,在子例程内部,哈希作为哈希引用被接收.您还需要使用命名散列调用子例程.

my_subroutine( { "anonymous" => "hash", "not" => "OK" } );  # not OK with proto
Run Code Online (Sandbox Code Playgroud)

  • 看看优秀的Tom Christiansen看[*Prototypes Considered Harmful*](http://www.perlmonks.org/?node_id=861966).我认为暗示OP(可能是初学者)可以适得其反,可以使用原型子程序,这样他们就不必在其调用参数中加入反斜杠. (2认同)