有没有在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});}
);
答案 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