【问题标题】:How can I determine if a Perl hash contains a key mapping to an undefined value?如何确定 Perl 哈希是否包含到未定义值的键映射?
【发布时间】:2011-01-08 15:49:51
【问题描述】:

我需要确定一个 Perl 散列是否有一个给定的键,但是那个键将被映射到一个 undef 值。具体来说,这样做的动机是在使用 getopt() 时查看布尔标志是否传递了哈希引用。我已经搜索了这个网站和谷歌,exists()defined() 似乎不适用于这种情况,他们只是查看给定键的值是否未定义,他们不检查是否哈希实际上有密钥。如果我是这里的 RTFM,请指向解释这一点的手册。

【问题讨论】:

    标签: perl hash key exists defined


    【解决方案1】:

    简答:

     if ( exists $hash{$key} and not defined $hash{$key} ) {
        ...
     }
    

    【讨论】:

      【解决方案2】:

      exists() 和 defined() 似乎不适用于这种情况,它们只是查看给定键的值是否未定义,它们不检查哈希是否确实具有键

      不正确。这确实是 defined() 所做的,但 exists() 完全符合您的要求:

      my %hash = (
          key1 => 'value',
          key2 => undef,
      );
      
      foreach my $key (qw(key1 key2 key3))
      {
          print "\$hash{$key} exists: " . (exists $hash{$key} ? "yes" : "no") . "\n";
          print "\$hash{$key} is defined: " . (defined $hash{$key} ? "yes" : "no") . "\n";
      }
      

      产生:

      $hash{key1} 存在:是 $hash{key1} 已定义:是 $hash{key2} 存在:是 $hash{key2} 已定义:否 $hash{key3} 存在:否 $hash{key3} 已定义:否

      这两个函数的文档可在命令行perldoc -f definedperldoc -f exists 获得(或阅读所有方法的文档perldoc perlfunc*)。官方网络文档在这里:

      *由于您特别提到了 RTFM,并且您可能不知道 Perl 文档的位置,我还要指出,您可以在 perldoc perl 或 @987654323 获得所有 perldocs 的完整索引@.

      【讨论】:

        【解决方案3】:

        如果我没看错你的问题,我认为你对exists 感到困惑。来自文档:

        存在 EXPR

        给定一个表达式,指定一个 哈希元素或数组元素,返回 如果指定元素在 哈希或数组曾经 初始化,即使对应的 值未定义。

        例如:

        use strict;
        use warnings;
        
        my %h = (
            foo => 1,
            bar => undef,
        );
        
        for my $k ( qw(foo bar baz) ){
            print $k, "\n" if exists $h{$k} and not defined $h{$k};
        }
        

        【讨论】:

          猜你喜欢
          • 2015-03-28
          • 2015-05-15
          • 1970-01-01
          • 1970-01-01
          • 2017-10-13
          • 1970-01-01
          • 2013-11-23
          • 1970-01-01
          • 2011-08-11
          相关资源
          最近更新 更多