哈希表中支持后解引用语法吗?

5

假设我有

my %foo;

我可以通过使用切片并使用后置表达式的方式,将键 foobarbaz 设置为 abc 吗?
%foo->@{qw/foo bar baz/} = qw/a b c/

我使用了这个语法,但有人告诉我它只是“意外地工作”。我没有看到它生成警告,并且我也没有在任何地方看到有关它的文档。这种行为是否得到支持?

3
由于取值语法在非引用上没有意义,这显然看起来是一个错误。这也破坏了LEFT->@{RIGHT} = @{LEFT}{RIGHT}的期望 - 前后缀取值将尝试将 %foo 转换为字符串,当其被替换到该模式中时。请使用普通的 @foo{...} 切片。 - amon
@foo{qw/foo bar baz/} = qw/a b c/; 或者在引用的情况下 @{$fooref}{qw/foo bar baz/}=qw/a b c/。后缀语法对我来说很新,我无法评论它的使用。 - Polar Bear
-> 的左侧应该是返回引用的表达式。 - ikegami
1
一个有趣的 bug!不可能正常工作,应该报告一下。(我在我的 perlbrew v5.30 上测试也能正常工作,没有警告。) - zdim
它不能为数组执行此操作,无法将数组用作引用... - zdim
perlbug 参考 https://github.com/Perl/perl5/issues/17722 - Ether
1个回答

8
< p > -> 的左侧应该是一个返回引用的表达式,使用其他任何东西都有风险。


%foo->{a} 曾经有效。

$ 5.10t/bin/perl -e'my %foo; %foo->{a} = 1; print "ok\n";'
ok

这被认为是一个bug。

$ 5.12t/bin/perl -e'my %foo; %foo->{a} = 1; print "ok\n";'
Using a hash as a reference is deprecated at -e line 1.
ok

$ 5.20t/bin/perl -e'my %foo; %foo->{a} = 1; print "ok\n";'
Using a hash as a reference is deprecated at -e line 1.
ok

$ 5.22t/bin/perl -e'my %foo; %foo->{a} = 1; print "ok\n";'
Can't use a hash as a reference at -e line 1.

没有理由相信 %foo->@{...}%foo->{...} 更有效。


已经报告了错误 .


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接