将数组减少为匿名哈希码

时间:2017-12-22 05:21:22

标签: perl

有没有在perl中做这样的事情(转换数组哈希并在一行中使用它)?

sub func{
 #from this
 my %args = @_;
 print $args{test};

 #to this
 print %{@_}{test};
}

我用它将错误传递给javascript等回调     用严格;     使用警告;

sub error{
 my $msg = shift;
 print("ERROR: $msg\n");
}

sub parse_args{
    my %args = @_;
    return $args{args};
}

sub do_something{
   my $args = parse_args(
     args=>{@_},
     optional_args=>["fail_cb"]
   );
   if(!0){
    return(exists $args->{fail_cb} ? $args->{fail_cb}->(err=>"not good") : 0);
   }
}

do_something(
 fail_cb => sub{error(({@_})->{err});}
);

2 个答案:

答案 0 :(得分:2)

是的,将其作为参考然后解除引用

sub func { say ${{@_}}{key} }

(我必须问,你真的想这样做吗?)

{@_}创建哈希引用,而${ ... }{}语法dereferences it (item 2)

更新问题编辑

显然,目的是运行回调。但是你需要运行那个回调

sub func { ${{@_}}{key}->() }

func( key => sub { say "cb here" } );

如果您按照要求打印该值,则会获得代码引用本身CODE(0x...)

或者,使用密钥和回调参数(参考)传递hashref

my $hr = { k1 => sub { .. }, k2 => sub { .. }, .. };
...
func($hr, $key, $arrayref_cb_args);

sub func { $_[0]->{$_[1]}->(@{$_[2]}) }

现在func可以动态决定运行的内容。这为您提供了更大的设计灵活性。

准备好测试

perl -wE'
    sub tt { $_[0]->{$_[1]}->(@{$_[2]}) };
    tt( { k1 => sub { say "args: @_" }}, "k1", [qw(cb here)] )
'

打印行args: cb here

答案 1 :(得分:1)

只需

即可轻松将其转换为哈希引用
{@a}

和取消引用条目,例如

({@a})->{key}

这是调试器日志:

$ perl -de0

Loading DB routines from perl5db.pl version 1.49_001
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

main::(-e:1):   0
  DB<1> @a = ('a',1,'b',2,'c',3)

  DB<2> x @a
0  'a'
1  1
2  'b'
3  2
4  'c'
5  3
  DB<3> x {@a}
0  'a'
1  1
2  'b'
3  2
4  'c'
5  3
  DB<4> x ({@a})
0  HASH(0x804d82e0)
   'a' => 1
   'b' => 2
   'c' => 3
  DB<5> x ({@a})->{c}
0  3