繁体   English   中英

如何检查Perl列表中是否有值?

[英]How can I check if a value is in a list in Perl?

我有一个文件,其中每一行都是代表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";
    }

提前致谢。

您要确保正确进行哈希处理。 过时的印章不是您要使用的。 请改用chomp ,并在创建哈希之前在整个数组上一次使用它:

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

chop返回被切碎的字符,而不是留下的字符。 您可能想要这样的东西:

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

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

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

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

尝试以下方法:

my @data=<FILE>;
chomp @data;

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

在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;

这应该可以工作...它first使用List :: Util进行搜索,并消除了初始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";
}

这可能与您的特定问题不完全匹配,但是如果需要对整数进行计数,您甚至可以使用旧的“规范” 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" 
 }

在某些情况下,这甚至可能比带有中间阵列的解决方案要快。

问候

机器人

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM