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

Jes*_*ica 9 string perl hash coding-style

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

$hash{"string"} or $hash{string}?
Run Code Online (Sandbox Code Playgroud)

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

dra*_*tun 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;
Run Code Online (Sandbox Code Playgroud)

将会呈现:

$VAR1 = { 'is_sub' => 'Nope', 'Yep!' => 'it is_sub!!' };
Run Code Online (Sandbox Code Playgroud)

我倾向于使用裸字...但是如果你正在调用一个子,请记住那些()或前面的+(参见jrockway的评论和答案);-)


Art*_*kii 12

它们在功能上是相同的,直到您的键中有空格或其他非字母数字字符.然后你必须使用引用的方法.

我更喜欢不引用并使用包含alpha_num和下划线的名称.这让我在没有引用大部分时间的情况下逃脱.

  • 它们在功能上并不相同.在某些情况下,您会得到相同的结果,但不是出于同样的原因. (3认同)

jro*_*way 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)
Run Code Online (Sandbox Code Playgroud)

当你从不引用字符串时,"怪异"的东西在视觉上与普通字符串不同......并且它被正确解析.

$hash{foo} = 1;
$hash{bar} = 2;
$hash{+function} = 3; # aha, this looks different... because it is
# ==> { foo => 1, bar => 2, 'OH HAI' => 3 }
Run Code Online (Sandbox Code Playgroud)

(Stack Overflow的语法突出显示了这一点,所以试着忽略它.)


Pau*_*han 7

出于迂腐,我总是在哈希中引用我的字符串引用.它有助于确保我不会有陷阱[1].

[1]我的Perl编码非常保守.


Ada*_*ire 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
Run Code Online (Sandbox Code Playgroud)

所有这一切,我开始引用一切,这是一个很难打破的习惯.即使在这么多年之后,引用你的哈希键在某种程度上感觉"更安全".