2012-11-05 78 views
1

我有一個很多零和'1'的字符串,但我只想從字符串的零值。 所以,我使用拆分功能拆分'1',但它似乎會產生數組中的undef或空字符串。 因此,我嘗試使用foreach掃描每個數組元素,並比較是否有空字符串,我認爲是「undef」將被忽略。作爲回報,那些非空字符串中的字符串將不會被忽略,並將被放入另一個變量中。這些問題看起來好像不能識別我的「undef」變量。如何擺脫perl中數組中的空字符串?

或 還有另一種更好的方法來掃描字符串,以便取消字符串中'0'的數量?

請幫忙解決這個問題。 這個編碼:

#!/usr/bin/perl 

    use strict; 
use warnings; 

    my $data = '111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000011111 
'; 

    my @values = split('1', $data); 
    my $zero = "0"; 
foreach my $val (@values) 
{ 
    if (!defined$val) 
    { 
     $zero= $val; 
    } 

} 
    print "$zero\n"; 

    exit 0; 

非常感謝。

問候, 尼基

回答

1
my $data = '111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000011111 
';  
my @arr=$data=~/0/g; 
print scalar(@arr); 

使用匹配操作,所有的0的可提取到的陣列,並且該陣列的長度將給出零的計數。

+3

您也可以使用[goatse-operator](http://www.catonmat.net/blog/secret-perl-operators/#goatse)縮短它:'my $ count =()= $數據=〜米/ 0 /克;' – simbabque

+0

@simbabque:感謝分享.. – Guru

+0

感謝分享..這真的解決了這個問題。很高興你的幫助:D – Nick

5

嘗試使用tr。它將所有出現的音譯爲空字符串並返回它所做的更改次數。這是你的零數。

my $data = '111100'; 
my $count = $temp =~ tr/0//; 
print $count; 

看看this blog post的不同方針的基準。

+2

你可以使用'tr/0/0 /'來避免修改原始字符串:'perl -E'$ d = 10101;說$ d =〜tr/0/0 /;說$ d;'輸出:'2','10101' –

+1

它不修改字符串。用'tr/0 //'使用你的樣品線。你需要'tr/0 // d'來告訴它刪除零。 (Zeroes?) –

+1

@JimDavis你是對的,謝謝。我編輯了我的答案。 [Wiktionary](http://en.wiktionary.org/wiki/zeroes#English)表示零和零都是正確的。我的柯林斯也這麼說,沒有AE/BE在這裏,只有兩個。 ;-) – simbabque

1

不能肯定正是你所需要的,但正則表達式可能是有用的:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $data = '111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000011111'; 

# If you want an array of zeros 

my @zeros = $data =~ /0/g; 
print "@zeros\n"; 

# If you want the zeros together 

my @multizeros = $data =~ /0+/g; 
print "@multizeros\n"; 

給出:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
000000000000000 
0

雖然正則表達式匹配將可能是做到這一點的最有效方法,作爲大師和cdarke已經建議,你可以做到這一點拆分組1 s而不是單個1 s:

$d = 101111001; 
say scalar split /1+/, $d; # prints 3