我应该在Perl中使用$ hash {“string”}或$ hash {string}吗?

时间:2009-09-23 23:01:46

标签: string perl hash coding-style

在Perl中,哪些是“更好”的风格?

$hash{"string"} or $hash{string}?

无论如何,它们的功能是否相同?

7 个答案:

答案 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}