我在perl中尝试了use constant
个值并偶然发现了以下奇怪的行为:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use constant {
a => "b"
};
my $c = { a => a };
my %d;
$d{a} = a;
print Dumper($c);
print Dumper(\%d);
将输出
$VAR1 = {
'a' => 'b'
};
$VAR1 = {
'a' => 'b'
};
常量a
已替换在表达式$d{a} = a
和a => a
的右侧,但不在左侧。
我知道常量是使用inlinable subs(documented here)实现的,如果子名称不是预先声明的(documented here),那么子名称会评估它们的名称,但我看不出有什么理由在我的示例a
对值进行一次计算,对同一行代码中的名称进行一次计算,尤其是对哈希的赋值 - a => a
可能是=>
解释左边的结果如果网站以字母开头,则为网址。
旁注:添加parantheses以使子调用显式化会产生预期结果:
# ...
my $c = { a() => a }; # or my $c = { a, a };
my %d;
$d{a()} = a;
# ....
输出:
$VAR1 = {
'b' => 'b'
};
$VAR1 = {
'b' => 'b'
};
(所有使用perl 5.18测试的例子)