[英]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";
}
提前致谢。
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.