1

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

或者还有另一种更好的方法来扫描字符串以提取字符串中“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

4 回答 4

5

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

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

查看这篇博客文章,了解不同方法的基准。

于 2012-11-05T11:41:38.703 回答
1
my $data = '111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000011111
';       
my @arr=$data=~/0/g;
print scalar(@arr);

使用匹配操作,可以将所有 0 提取到一个数组中,并且数组的长度将给出零的计数。

于 2012-11-05T11:41:29.543 回答
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
于 2012-11-05T11:48:33.163 回答
0

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

$d = 101111001;
say scalar split /1+/, $d;    # prints 3
于 2012-11-05T13:43:04.617 回答