【问题标题】:How can I check if a value is in a list in Perl?如何检查一个值是否在 Perl 的列表中?
【发布时间】:2011-02-10 07:59:33
【问题描述】:

我有一个文件,其中每一行都是一个表示 id 的整数。我想要做的只是检查一些特定的 id 是否在这个列表中。 但是代码不起作用。即使 123 是该文件中的一行,它也永远不会告诉我它存在。我不知道为什么?帮助表示赞赏。

open (FILE, "list.txt") or die ("unable to open !");

    my @data=<FILE>;

    my %lookup  =map {chop($_) => undef} @data;

    my $element= '123';
    if (exists $lookup{$element})
    {
        print "Exists";
    }

提前致谢。

【问题讨论】:

标签: perl list hash arrays


【解决方案1】:

您希望确保正确生成哈希。非常过时的chop 不是您想要使用的。请改用chomp,并在创建哈希之前立即在整个数组上使用它:

 open my $fh, '<', 'list.txt' or die "unable to open list.txt: $!";
 chomp( my @data = <$fh> );
 my $hash = map { $_, 1 } @data;

【讨论】:

    【解决方案2】:

    对于 Perl 5.10 及更高版本,您还可以使用智能匹配运算符:

    my $id = get_id_to_check_for();
    open my $fh, '<', 'list.txt' or die "unable to open list.txt: $!";
    chomp( my @data = <$fh> );
    print "Id found!" if $id ~~ @data;
    

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        chop 返回它切掉的字符,而不是留下的字符。你可能想要这样的东西:

        my %lookup = map { substr($_,0,-1) =&gt; undef } @data;

        但是,一般来说,您应该考虑使用 chomp 而不是 chop 来进行更智能的 CRLF 删除,因此您最终会得到这样的一行:

        my %lookup =map {chomp; $_ =&gt; undef } @data;

        【讨论】:

          【解决方案5】:

          您的问题是,chop 返回的是被切碎的字符,而不是生成的字符串,因此您正在为换行符创建一个带有单个条目的哈希。如果您使用 Data::Dumper 输出结果哈希,这在调试中会很明显。

          试试这个:

          my @data=<FILE>;
          chomp @data;
          
          my %lookup = map {$_ => undef} @data;
          

          【讨论】:

            【解决方案6】:

            这应该可以工作...它使用 List::Util 中的first 进行搜索,并消除了初始的map(这是假设您不需要立即存储其他值) . chomp 在搜索值时完成;见perldoc -f chomp

            use List::Util 'first';
            open (my $fh, 'list.txt') or die 'unable to open list.txt!';
            
            my @elements = <$fh>;
            
            my $element = '123';
            if (first { chomp; $_ eq $element } @elements)
            {
                print "Exists";
            }
            

            【讨论】:

              【解决方案7】:

              这可能与您的具体问题不完全匹配, 但如果你的整数需要 算了,你甚至可以用好的 旧的“规范” perl 方法:

               open my $fh, '<', 'list.txt' or die "unable to open list.txt: $!";
              
               my %lookup;
               while( <$fh> ) { chomp; $lookup{$_}++ }   # this will count occurences if ints
              
               my $element = '123';
               if( exists $lookup{$element} ) {
                  print "$element $lookup{$element} times there\n" 
               }
              

              在某些情况下,这甚至可能比 具有中间数组的解决方案。

              问候

              rbo

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-06-20
                • 1970-01-01
                • 1970-01-01
                • 2019-06-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-02-18
                相关资源
                最近更新 更多