在Perl中,如何取消引用作为参数传递的临时哈希?

在Perl中,如何取消引用作为参数传递的临时哈希?,perl,Perl,在Perl中,如何取消引用作为参数传递给函数的临时哈希 MyFunct({ Param1 => "knob1", Param2 => "knob2" }); # this part never seems to work... sub MyFunct { my %param = %{shift()}; my $p1 = $param{Param1}; print "p1: $p1\n"; } 您的代码按原样工作 $ perl -e'

在Perl中,如何取消引用作为参数传递给函数的临时哈希

MyFunct({ 
    Param1 => "knob1",
    Param2 => "knob2"
});

# this part never seems to work...
sub MyFunct {
    my %param = %{shift()};
    my $p1 = $param{Param1};
    print "p1: $p1\n";
}
您的代码按原样工作

$ perl -e'
    MyFunct({
        Param1 => "knob1",
        Param2 => "knob2"
    });

    # this part never seems to work...
    sub MyFunct {
        my %param = %{shift()};
        my $p1 = $param{Param1};
        print "p1: $p1\n";
    }
'
p1: knob1
也就是说,您不必要地复制了引用的散列。以下是一个更好的方法:

$ perl -e'
    MyFunct({
        Param1 => "knob1",
        Param2 => "knob2"
    });

    sub MyFunct {
        my $param = shift;
        my $p1 = $param->{Param1};
        print "p1: $p1\n";
    }
'
p1: knob1

除了@ikegami的答案,我还要补充一点,也许你不需要推荐人。通过使用隐式参数数组
@
,将值作为键/值对传递,可以轻松地将列表转换为散列

键/值对可以通过使用箭头
=>
分隔符来执行,或者在其位置使用标准逗号
分隔符。下面是使用箭头的示例


如果目的确实是传递命名参数,我也会这样做。在外面需要大括号是打字的愚蠢浪费。然而,我没有得到这样的印象,特别是考虑到OP之前提出的另一个问题。(不是我投了反对票。)哈。我没有怀疑任何事情,我也不担心落选。我想有人不喜欢这个问题,所以否决了所有答案(?),他们的账户可能会在一周内关闭:)我制定了一个惯例,你可能会嘲笑它。对于每个子例程,为了理解和一致性,我都会…
my$args={@}
。它可能效率较低,我不知道这会产生多大的影响,但这是有帮助的。我不认为有一些额外的取消引用会影响代码的性能。好吧,如果伟大的@ikegami说没关系的话。。然后我只需要添加评论<代码>#ikegami说没关系https://stackoverflow.com/a/51460050/183181:哇,看起来他们已经做了一些优化,因为从5.22开始,
$a->{x}
的操作数与
$a{x}
相同!现在用CPU操作而不是Perl操作来衡量差异。请出示我们可以用来重现您所遇到的问题的注释。注释不用于扩展讨论;这段对话已经结束。
#!/usr/bin/perl

MyFunct( 
  Param1 => "knob1",
  Param2 => "knob2"
);

# this part never seems to work...
sub MyFunct {
  my %param = @_;
  my $p1 = $param{Param1};
  local $\ = "\n";
  print "p1: $p1";
  print "p2: $param{Param2}";
}