2011-08-29 15 views
0

我基本上是一個網絡人,所以不擅長編寫腳本。perl hecking all value once

在編寫一些腳本時,我遇到了下面的要求。

我有一個散列陣列的「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」,而不是低於哈希運作良好

my %hash_array1=(A=>1,B=>2,C=>2); 

它打印的地方

Evolution 

No Evolution 

這不符合我的預期。我想在這裏打印一次,不應該再打印「Evolution」和「No Evolution」。 (但循環應繼續迭代)

請讓我知道是否需要更清晰。

問候

馬赫什

+0

因爲我是網絡人,所以我必須善於編寫腳本;) –

回答

0

我會使用類似:

#!/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"; 
} 
+0

這也是一個很好的方法,雖然我懷疑執行時間會和我的相似,因爲'join'必須得到所有的值並且構建字符串。這就是說,你只需要做負面的比賽 - 如果失敗了,那麼他們都不是「1」。您擁有它的方式只適用於包含3個值的散列,這與他的要求相反;他想知道設置中是否有「1」(或者相反,如果有一個 - 你只需要檢查其中一個) –

+0

謝謝我錯誤地讀了這個問題。 – 2011-08-29 11:31:19

+0

謝謝。這是偉大的邏輯,更少的代碼行......問候:Mahesh – Mahesh

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; 
} 
+0

謝謝Brian,我會在我的腳本中嘗試這個,會讓你知道結果.. Maardsh – Mahesh

4
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; 
} 

(有些評論正在談論執行時間;這應該不是一個問題,除非它被證明存在性能問題。)

+0

感謝寶貴的邏輯以及性能問題。問候 - 馬赫什 – Mahesh