2012-11-05 80 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