Perl哈希值是否应该包含值?

Dr.*_*ust 8 perl hash

我之前有一个问题得到了Perl专家,Perl作者和Perl培训师brian d foy 的以下回复:

[If]你在每个文件名的末尾寻找一个固定的字符序列.您想知道该固定序列是否在您感兴趣的序列列表中.将所有扩展存储在哈希中并查看该哈希:
    my( $extension ) = $filename =~ m/\.([^.]+)$/;
    if( exists $hash{$extension} ) { ... }
您不需要构建正则表达式,也不需要经历几个可能的正则表达式替换来检查您必须检查的每个扩展.

感谢brian的建议.

我现在想知道的是在上述案例中最佳做法是什么.应该只定义键,这是我需要实现上述内容,还是应该总是定义一个值?

Mic*_*man 6

通常最好为每个键设置一个定义的值.惯用价值(当你不关心价值时)是1.

my %hash = map { $_ => 1 } @array;
Run Code Online (Sandbox Code Playgroud)

这样做会使代码使用哈希稍微简单,因为您可以使用$hash{key}布尔值.如果值可以是未定义的,则需要使用更详细的exists $hash{key}.

也就是说,有些情况下需要值undef.例如:假设您正在解析C头文件以提取预处理器符号.将这些存储在name => value对的散列中是合乎逻辑的.

#define FOO 1
#define BAR
Run Code Online (Sandbox Code Playgroud)

在Perl中,这将映射到:

my %symbols = ( FOO => 1, BAR => undef);
Run Code Online (Sandbox Code Playgroud)

在C中,a #define定义一个符号,而不是一个 - 在C中,"defined"被映射到Perl中的"exists".

  • @daotoad:如何修改?Autovivification 不会发生在简单的检索中(但如果您执行诸如 $hash{$key}{subkey} 之类的操作会发生)。 (2认同)

Jer*_*all 5

您无法创建没有值的哈希键。该值可以是 undef 但它会在那里。否则你会如何构造一个散列。或者你的问题是关于价值是否可以是 undef?在这种情况下,我会说您存储在那里的值 (undef, 1, 0 ...) 完全取决于您。如果很多人都在使用它,那么你可能想要存储一些真正的价值,尽管其他人使用 if ($hash{$extension}) {...} 而不是存在,因为他们没有注意。

  • 您当然可以创建一个没有值的哈希键。这就是为什么那个漂亮的 defined() 运算符存在的原因。:) (2认同)