计算Perl中的字符数

时间:2017-05-01 12:39:24

标签: perl for-loop character

我需要计算字符串中的字母“e” $x="012ei ke ek ek ";

到目前为止,我已尝试使用for循环:

$l=length($x);

$a=0;
for($i=0;$i<$l;$i++)
{$s=substr($x,$i,1);
if($s=="e")
{$a++;}

print $a;

3 个答案:

答案 0 :(得分:6)

您的代码存在一些问题。你忘了关闭for环形支架, 并且在Perl ==中应该比较数字。使用eq表示字符串。

还建议您使用警告并启用严格模式, 这会帮助你调试这个。在您的情况下,自e 将被视为0,因此另一个char子串,12e相比,它是唯一不等于==的字符。一个 清理过的代码版本可以写成:

use warnings;
use strict;

my $x = "012ei ke ek ek ";
my $l = length $x;

my $count = 0;

for(my $i = 0; $i < $l; $i++) {
    my $s = substr($x, $i, 1);
    $count++ if ($s eq "e");
}

print $count;

有多种方法可以实现这一目标。你可以使用匹配 group,如果全局返回列表上下文中的所有匹配项。 由于您需要数字,因此请在标量上下文中使用此结果。您可以 例如通过以下方式实现这一目标:

my $count = () = $string =~ /(e)/g;

或者:

my $count = @{[ $string =~ /(e)/g ]}

另一种方法是将字符串拆分为字符并将其分解为字符 是 e

my $count = grep $_ eq 'e', split //, $string;

可能最紧凑的是使用tr来返回计数 标量上下文中的字符,虽然这确实限制了这种用法 仅计算字符:

my $count = $string =~ tr/e//;

答案 1 :(得分:0)

当您使用字符串比较==时,您可以将字符与数字运算符(eq)进行比较。如果你使用了warnings pragma,你会看到它。

您的代码应该看起来像:

#!/usr/bin/env perl
use strict;
use warnings;
my $x = "012ei ke ek ek ";
my $l = length($x);
my $a = 0;
for ( my $i = 0; $i < $l; $i++ ) {
    my $s = substr( $x, $i, 1 );
    if ( $s eq "e" ) {
        $a++;
    }
}
print "$a\n";

正确的缩进以及strictwarnings pragma的使用将避免和/或捕获无意的,愚蠢的错误。

实现答案的更多Perl-ish(和更短)方式是:

perl -le '$x="012ei ke ek ek";@count=$x=~m/e/g;print scalar @count'
4

全局匹配并收集列表上下文中的所有匹配项。列表的标量值给出了您寻找的出现次数。

另一种方法是使用tr

perl -le '$x="012ei ke ek ek";print scalar $x=~tr/e//'
4

答案 2 :(得分:0)

0091已经提到过脚本中的问题和所有可能的方法,但是TIMTOWTDI。

@sidyll