作者:xuxiao | 来源:互联网 | 2022-12-09 10:02
问题是Perl中的一对大括号是不明确的,可能是块或匿名散列
由于你的哈希内容g
(请使用更好的名字)perl假设你正在编写一个代码块,它只是一个标量值列表
让它更明确,你的代码将按预期运行
use strict;
use warnings 'all';
sub foo {
{
a => 1,
b => 2,
}
}
sub bar {
my $href = {
%{ foo() },
c => 3,
d => 4,
}
}
use Data::Dump;
dd bar();
产量
{ a => 1, b => 2, c => 3, d => 4 }
ikegami..
7
Perl语言含糊不清.举个例子
sub some_sub {
{ } # Is this a hash constructor or a block?
}
{ }
是块的有效语法("裸循环").
{ }
是哈希构造函数的有效语法.
两者都被允许作为声明!
所以Perl必须猜测.Perl通常猜对了,但并不总是这样.在你的情况下,它猜对了f()
,但不是g()
.
要解决此问题,您可以提供Perl"提示".一元 - +
可以用来做到这一点.一元+
是一个完全透明的运营商; 它什么都不做.但是,必须后跟表达式(不是语句).{ }
只有一种可能的含义作为表达.
+{ } # Must be a hash constructor.
同样,你可以欺骗Perl来猜测另一种方式.
{; } # Perl looks ahead, and sees that this must be a block.
所以在这种情况下,你可以使用
sub g { +{
%{f()},
c => 3,
d => 4,
} }
要么
sub g { return {
%{f()},
c => 3,
d => 4,
} }
(return
如果有的话,还必须跟一个表达式.)
1> Borodin..:
问题是Perl中的一对大括号是不明确的,可能是块或匿名散列
由于你的哈希内容g
(请使用更好的名字)perl假设你正在编写一个代码块,它只是一个标量值列表
让它更明确,你的代码将按预期运行
use strict;
use warnings 'all';
sub foo {
{
a => 1,
b => 2,
}
}
sub bar {
my $href = {
%{ foo() },
c => 3,
d => 4,
}
}
use Data::Dump;
dd bar();
产量
{ a => 1, b => 2, c => 3, d => 4 }
2> ikegami..:
Perl语言含糊不清.举个例子
sub some_sub {
{ } # Is this a hash constructor or a block?
}
{ }
是块的有效语法("裸循环").
{ }
是哈希构造函数的有效语法.
两者都被允许作为声明!
所以Perl必须猜测.Perl通常猜对了,但并不总是这样.在你的情况下,它猜对了f()
,但不是g()
.
要解决此问题,您可以提供Perl"提示".一元 - +
可以用来做到这一点.一元+
是一个完全透明的运营商; 它什么都不做.但是,必须后跟表达式(不是语句).{ }
只有一种可能的含义作为表达.
+{ } # Must be a hash constructor.
同样,你可以欺骗Perl来猜测另一种方式.
{; } # Perl looks ahead, and sees that this must be a block.
所以在这种情况下,你可以使用
sub g { +{
%{f()},
c => 3,
d => 4,
} }
要么
sub g { return {
%{f()},
c => 3,
d => 4,
} }
(return
如果有的话,还必须跟一个表达式.)