我觉得必须有更好的方法来计算事件,而不是在Linux中的perl,shell中编写sub。
#/usr/bin/perl -w
use strict;
return 1 unless $0 eq __FILE__;
main() if $0 eq __FILE__;
sub main{
my $str = "ru8xysyyyyyyysss6s5s";
my $char = "y";
my $count = count_occurrence($str, $char);
print "count<$count> of <$char> in <$str>\n";
}
sub count_occurrence{
my ($str, $char) = @_;
my $len = length($str);
$str =~ s/$char//g;
my $len_new = length($str);
my $count = $len - $len_new;
return $count;
}
答案 0 :(得分:13)
可以使用Perl中的一行(与4行相比)计算字符串中字符的出现次数。不需要sub(尽管在sub中封装功能没有任何问题)。来自perlfaq4 "How can I count the number of occurrences of a substring within a string?"
use warnings;
use strict;
my $str = "ru8xysyyyyyyysss6s5s";
my $char = "y";
my $count = () = $str =~ /\Q$char/g;
print "count<$count> of <$char> in <$str>\n";
答案 1 :(得分:6)
如果角色不变,则最好:
my $count = $str =~ tr/y//;
如果角色是可变的,我会使用以下内容:
my $count = length( $str =~ s/[^\Q$char\E]//rg );
如果我想要与早于5.14的Perl版本兼容(因为它更慢并且使用更多内存),我只会使用以下内容:
my $count = () = $str =~ /\Q$char/g;
以下不使用内存,但可能有点慢:
my $count = 0;
++$count while $str =~ /\Q$char/g;
答案 2 :(得分:3)
在漂亮的 * Bash / Coreutils / Grep单行中:
$ str=ru8xysyyyyyyysss6s5s
$ char=y
$ fold -w 1 <<< "$str" | grep -c "$char"
8
或者
$ grep -o "$char" <<< "$str" | wc -l
8
第一个只有当子串只有一个字符长时才有效;第二个只有当子串不重叠时才有效。
*不是真的。
答案 3 :(得分:2)
toolic给出了正确答案,但您可能会考虑不对您的值进行硬编码以使程序可重复使用。
count.pl needles haystack.txt
some_process | count.pl foo
count.pl x xyzzy
这将允许您使用程序计算字符串,文件或标准输入中字符或字符串的出现次数。例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap Grid System</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<!-- Optional Bootstrap theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css">
</head>