有没有更好的方法来计算字符串中char的出现?

时间:2015-12-23 13:56:02

标签: perl sh

我觉得必须有更好的方法来计算事件,而不是在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;
}

4 个答案:

答案 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>