在Perl中,哪种风格更好呢?
无论如何,它们的功能都是相同的吗?
$hash{"string"} or $hash{string}?
无论如何,它们的功能都是相同的吗?
$hash{"string"} or $hash{string}?
从 perldata perldoc 中得知:
实际上,在大括号内的标识符被强制转换为字符串,作为哈希下标中的任何简单标识符也是如此。它们都不需要引用。我们之前的示例,
$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 的评论和答案);-)
$version{2.0}
和$version{'2.0'}
的例子让我感到困惑,因为这个:perl -e '$foo{'2.0'}=1; print $foo{'2'}++, $foo{2}++, $foo{2.0}++, $foo{1+1}++, "\n";'
。花括号中的值被计算为标量,然后该标量被用作键。所以我必须假设您没有测试您的示例,或者我在您试图表达的内容中遗漏了一些微妙之处。(对我来说,它打印1234) - Jim Dennis它们在功能上是相同的,除非您的键中有空格或其他非字母数字字符。那么您就必须使用带引号的方法。
我更喜欢不使用引号并使用包含alpha_num和下划线的名称。这让我大多数情况下都不用引号。
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 }
# 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
话虽如此,我一开始时总是引用所有内容,这已经成为了一种难以改变的习惯。即使过了这么多年,引用哈希键仍然感觉更加“安全”。
出于追求严谨,我总是在哈希中引用我的字符串引用。这有助于确保我不会遇到意外情况[1]。
[1]在Perl编程中,我比较保守。
$hash{string}
更为简洁,但仅适用于字母数字和下划线。除非你想要$hash{string}
,否则你应该总是使用$hash{"string"}
。