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 中,检查一个 json 解码的布尔值

如何检查一个文件的值是不是包含在另一个文本文件中? (perl 脚本)

如何在 Perl 中使用 grep 检查字符串是不是存在 [重复]

如何验证 Perl 中的数组(列表)中是不是存在值?

对所有变量执行相同的操作,但在Perl函数中传递第一个变量

perl 开关的代码内检查