perl 一次检查所有值
Posted
技术标签:
【中文标题】perl 一次检查所有值【英文标题】:perl hecking all value once 【发布时间】:2011-08-29 06:12:16 【问题描述】:我基本上是一个网络人,所以不擅长编写脚本。
在编写一些脚本时,我遇到了以下要求。
我有一个哈希数组,其中一些值为“1”或“2”以及我的要求
如果所有值都不等于“1”(可能是“2”或“3”),那么它将打印一些语句然后退出该循环。
如果任何一个值等于“1”,那么它将打印一些语句。
例如:
my %hash_array1=(A=>2,B=>2,C=>2);
my @array2=values (%hash_array1);
foreach my $line (@array2)
if ($line!=1)
print BOLD GREEN "\rNo Evolution ",RESET;
last;
else
print BOLD RED "Evolution \n",RESET;
哪个打印
No Evolution
上面的代码对于提到的 hash_array 可以正常工作,因为所有的值都不是“1”,但是对于下面的 hash 就不行了
my %hash_array1=(A=>1,B=>2,C=>2);
打印位置
Evolution
No Evolution
这与我的预期不符。我想在这里打印一次“进化”和“无进化”不应该再打印了。 (不过循环应该继续迭代)
如果需要更清晰的说明,请告诉我。
问候
马赫什
【问题讨论】:
因为我是网络人,所以我必须擅长编写脚本;) 【参考方案1】:my %hash_array1=(A=>2,B=>2,C=>2);
if ( grep $_ == 1, values %hash_array1 )
print BOLD RED "Evolution \n",RESET;
else
print BOLD GREEN "\rNo Evolution ",RESET;
(一些 cmets 正在谈论执行时间;除非证明存在性能问题,否则这不应该成为问题。)
【讨论】:
感谢您提供有价值的逻辑以及对性能问题的肯定。问候--马赫什【参考方案2】:如果我正确阅读了您的要求,您将需要检查整个集合,除非您点击“1”
基本上,你需要保持一个状态,只有当你点击“1”时才退出循环
my %hash_array1=(A=>2,B=>2,C=>2);
my @array2=values (%hash_array1);
my $state = 0;
foreach my $line (@array2)
if ($line == 1)
$state = 1;
last;
if ($state == 1)
print BOLD RED "Evolution \n",RESET;
else
print BOLD GREEN "\rNo Evolution ",RESET;
【讨论】:
谢谢布赖恩,我会在我的脚本中尝试这个,并让你知道结果..问候:Mahesh【参考方案3】:我会使用类似的东西:
#!/usr/bin/perl
my %hash_array1=(A=>1,B=>1,C=>2);
my $values = join('', values(%hash_array1));
if ($values =~ /1/)
print "at least one 1";
else
print "no 1";
【讨论】:
这也是一个很好的方法,尽管我怀疑执行时间与我的相似,因为join
必须获取所有值并构建字符串。话虽如此,您只需要进行否定匹配 - 如果失败,那么它们都是非“1”。您拥有它的方式仅适用于包含 3 个值的哈希,这与他的要求相反;他想知道集合中是否没有“1”(或者相反,如果有 - 你只需要检查一个或另一个)
谢谢。这是一个很好的逻辑,代码行数更少……太棒了……问候:Mahesh以上是关于perl 一次检查所有值的主要内容,如果未能解决你的问题,请参考以下文章
如何检查一个文件的值是不是包含在另一个文本文件中? (perl 脚本)