我需要计算字符串中的字母“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;
答案 0 :(得分:6)
您的代码存在一些问题。你忘了关闭for
环形支架,
并且在Perl ==
中应该比较数字。使用eq
表示字符串。
还建议您使用警告并启用严格模式,
这会帮助你调试这个。在您的情况下,自e
将被视为0,因此另一个char子串,1
和2
与e
相比,它是唯一不等于==
的字符。一个
清理过的代码版本可以写成:
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";
正确的缩进以及strict
和warnings
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