关于hash ++的澄清

时间:2011-06-27 16:33:30

标签: perl operators

我正在阅读Damian Conway的“Perl最佳实践”并找到以下代码snipet:

$have_reconsidered{lc($name)}++;

我试图通过哈希来弄清楚这里发生了什么。我知道++在数值上下文中递增1,但它对散列做了什么?

来自perlop documentation

  

undef始终被视为数字,   特别是改为0   在递增之前(以便a   undef值的后递增   返回0而不是undef)。该   自动递减运算符不是   神奇。

因此,在上面的示例中,键lc($name)的值是否已初始化为0,然后由1增加到++

一般来说,我在哪里可以找到有关+++=等行为的更多信息?

3 个答案:

答案 0 :(得分:4)

%have_reconsidered是你的哈希。 $name是一个字符串。 lc($name)返回小写字符串。 $hash{$key}将返回存储在密钥%hash中的哈希$key的标量值。这样:

// get scalar value from hash at key lc($name) and post-increment it
$have_reconsidered(lc($name)}++;

所以,你要做的只是在给定索引的散列中增加值(即lc($name)

测试用例:

#!/bin/env perl
my %hash = ( 'a' => '2' );
my $name = 'A';
print $hash{lc($name)}++; // prints 2 (incremented after statement)
print $hash{lc($name)};   // prints 3
print ++$hash{lc($name)}; // prints 4 (incremented before statement)

答案 1 :(得分:2)

哈希值是标量,因此$have_reconsidered{lc($name)}++;会增加标量 $have_reconsidered{lc($name)}。如果该标量先前未定义或不存在,++将其设置为1。

此代码的目标可能是删除重复项。

>perl -E"++$seen{$_} for qw( a a a b c a d ); say keys %seen;"
cabd

我更喜欢类似但不同的方法,因为它保留了秩序。

>perl -E"say grep !$seen{$_}++, qw( a a a b c a d );"
abcd

答案 2 :(得分:0)

$ have_reconsidered {lc($ name)}是属于密钥lc($ name)的散列%has_reconsidered的值。这个值肯定是数字,但即使它是一个字符串,它仍然可以自动递增(参见http://perldoc.perl.org/perlop.html#Auto-increment-and-Auto-decrement)。