在Perl中,哪些是“更好”的风格?
$hash{"string"} or $hash{string}?
无论如何,它们的功能是否相同?
答案 0 :(得分:13)
来自perldata perldoc:
实际上,这些curlies中的标识符被强制为字符串,哈希下标中的任何简单标识符也是如此。也不需要引用。我们之前的示例
$days{'Feb'}
可以写为$days{Feb}
,引号将自动生成。但是下标中更复杂的东西将被解释为表达式。这意味着,例如$version{2.0}++
相当于$version{2}++
,而不是$version{'2.0'}++
所以从根本上说是相同的。但要注意陷阱:
sub is_sub { 'Yep!' }
my %hash;
$hash{ is_sub } = 'Nope';
$hash{ is_sub() } = 'it is_sub!!';
say Dumper \%hash;
将显示:
$VAR1 = { 'is_sub' => 'Nope', 'Yep!' => 'it is_sub!!' };
我的偏好是针对裸字...但是如果你正在调用子词,请记住那些()或前面的+(参见jrockway的评论和答案); - )
答案 1 :(得分:12)
它们在功能上是相同的,直到您的键中有空格或其他非字母数字字符。然后你必须使用引用的方法。
我更喜欢不引用并使用包含alpha_num和下划线的名称。这让我可以逃避大部分时间没有引用。
答案 2 :(得分:8)
避免引用更为惯用。
编辑添加:
引用不是绝对可读性的解决方案。考虑一下这里的不一致性:
sub function() { 'OH HAI' }
my @list = ('foo', 'bar', function);
# ==> ('foo', 'bar', 'OH HAI')
my %hash;
$hash{'foo'} = 1;
$hash{'bar'} = 2;
$hash{function} = 3;
# ==> { foo => 1, bar => 2, function => 3 } (oops)
当你从不引用字符串时,“怪异”的东西在视觉上与普通字符串不同......并且它被正确解析。
$hash{foo} = 1;
$hash{bar} = 2;
$hash{+function} = 3; # aha, this looks different... because it is
# ==> { foo => 1, bar => 2, 'OH HAI' => 3 }
(Stack Overflow的语法突出显示了这一点,所以试着忽略它。)
答案 3 :(得分:7)
出于迂腐,我总是用哈希引用我的字符串引用。它有助于确保我不会有陷阱[1]。
[1]我的Perl编码非常保守。
答案 4 :(得分:7)
大多数人都喜欢没有引号的表单,因为只要哈希键仅限于字母数字和下划线,它就会更加简洁和整洁。此外,大多数具有Perl语法支持的编辑器都知道如何将它们突出显示为字符串,尽管它们不在引号内。
应该注意的是,不仅在使用哈希键时,而且在定义哈希值,传递参数时,甚至在使用=>
时定义列表时,都可以获得此行为。在前两种情况下,它可以帮助您在视觉上区分键和值。例子:
# Hash construction
my %hash = (
key1 => "val1",
key2 => "val2"
);
# Subroutine arguments
some_function( arg1 => "val1", arg2 => $val2);
sub some_function { my %args = @_; }; # arguments are pulled in as a hash
# List construction (of course, not sure why you'd do this...)
my @list = (Foo => "bar");
print @list; # prints Foobar
所有这一切,我开始引用一切,这是一个很难打破的习惯。即使在这些年之后,引用你的哈希键在某种程度上感觉“更安全”。
答案 5 :(得分:4)
后一种格式$hash{string}
更简洁,但它只适用于字母数字和下划线。
答案 6 :(得分:0)
除非您需要$hash{"string"}
,否则应始终$hash{string}
。