2011-10-13 62 views
-3

我在想,如果在沒有for循環的Perl中這是可能的。如何在Perl中檢查數組的值範圍

我有一個數組,填充範圍從1到7的數字(可以重複)。

我正在對數組進行排序。然後我得到最低的元素。

我需要的是,如果第一個元素的值是1,那麼我想檢查數組是否包含(2,3,4,5)。

我可以在一行中做到這一點,沒有循環?

+2

如果第一個元素不是1,會發生什麼情況?爲什麼你想避免循環? – musiKk

+0

我得到更新另一個系統的狀態很複雜,我不想解釋。如果值> 1,那麼我做別的事情。 – KK99

+1

對此我是新手,但是在想......你可能會打印@arr到一個$字符串,然後可能是正則表達式來找到這個模式...... – Carpenter

回答

3

我不明白爲什麼你第一次但對一些價值觀的存在,在陣列可以使用例如這種方法的檢查排序數組:

sub check2345 { 
    my %h; 
    @h{@_}=(); 
    return 4 == grep exists $h{$_}, 2 .. 5; 
} 

如果依靠一個線路(表達):

do{my%h;@h{@array}=();4==grep exists$h{$_},2..5} 
-1

您可以通過使用一個grep/keys/map構建在一行做到這一點:

#!perl 

use strict; 
use warnings; 
use 5.010; 

my @arr = (1, 2, 4, 5); 
say "has 2, 3, 4, 5" if 4 == grep { $_ == 2 || $_ == 3 || $_ == 4 || $_ == 5 } keys %{{ map { $_ => 1 } @arr }}; 

如果你的元素都將是整數,可以縮短grep到:

grep { $_ >= 2 && $_ <= 5 } 

如果你想的東西多一點支持的(即如果您的最終邊界可能被改變),你可以嘗試:

#!perl 

use strict; 
use warnings; 
use 5.010; 

my @arr = (1, 2, 4, 5); 
my $first = 2; 
my $last = 5; 
say "has them all" if ($last-$first+1) == grep { $_ >= $first && $_ <= $last } keys %{{ map { $_ => 1 } @arr }}; 

(請注意,我的兩個例子腳本應該打印任何操作,因爲數組沒有所有元素(2,3, 4,5))。

編輯:基於以下Hynek的評論,我已經刪除了無用的map,並允許在原始數組中使用重複值。

+0

您的映射使用是無用的,並且您的解決方案都不能解決明確提出的重複問題。 –

+0

@ Hynek-Pichi-Vychodil:我編輯了我的文章以反映您的意見。 – CanSpice