如何在perl中删除数组中的空字符串?

时间:2012-11-05 11:30:05

标签: arrays perl

我有一串多个零和'1',但我只想要字符串中的零值。 所以,我使用split函数来分割'1'但似乎它会在数组中产生undef或空字符串。 所以,我尝试使用foreach扫描每个数组元素,并比较是否有空字符串我认为是“undef”将被忽略。作为回报,非空字符串中的那些将不会被忽略,并将被放入另一个变量中。这些问题似乎无法识别我的“undef”变量。

OR 有另一种更好的方法来扫描字符串,以拉出字符串中的'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;

非常感谢。

此致 尼基

4 个答案:

答案 0 :(得分:5)

尝试使用tr。它将所有出现的 0 音译为空字符串,并返回它所做的更改次数。这是你的零数。

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

请查看this blog post以获取不同方法的基准。

答案 1 :(得分:1)

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

使用匹配操作,可以将所有0都提取到数组中,并且数组的长度将计算为零。

答案 2 :(得分: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

答案 3 :(得分:0)

虽然正则表达式匹配可能是最有效的方法,正如Guru和cdarke已经建议的那样,你可以通过拆分1 s组来进行拆分单1 s:

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