我正在阅读Damian Conway的“Perl最佳实践”并找到以下代码snipet:
$have_reconsidered{lc($name)}++;
我试图通过哈希来弄清楚这里发生了什么。我知道++
在数值上下文中递增1,但它对散列做了什么?
undef始终被视为数字, 特别是改为0 在递增之前(以便a undef值的后递增 返回0而不是undef)。该 自动递减运算符不是 神奇。
因此,在上面的示例中,键lc($name)
的值是否已初始化为0
,然后由1
增加到++
?
一般来说,我在哪里可以找到有关++
,+=
等行为的更多信息?
答案 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)。