如何使用perl计算一行中的重复字符串

时间:2018-01-07 06:01:59

标签: perl

我有以下文件

文件1:

abc def host 123 host 869 host

我写下面的脚本来计算每行中“host”关键字的出现次数。 我尝试了所有的方法(参考评论的那些)仍然似乎没有用。 sed命令在命令行中工作,但不在perl脚本中工作

imports

我是perl的初学者。寻找您宝贵的建议

3 个答案:

答案 0 :(得分:3)

您自己的解决方案将匹配hostagesShostakovich

等实例

grep是计算列表元素的规范方式,split会将您的行转换为单词列表,给出

my $count = grep { $_ eq 'host' } split ' ', $line

答案 1 :(得分:1)

这会产生host$line的实例数:

my $count = () = $line =~ /host/g;

但这也匹配hosting。为避免这种情况,以下内容可能会起到作用:

my $count = () = $line =~ /\bhost\b/g;

=()=这被称为Perl secret Goatse运算符。更多info

答案 2 :(得分:1)

我不知道为什么你在你的例子中循环遍历两个文件,但你可以使用/g(全局)标志:

my $line = "abc def host 123 host 869 host";

my $x = 0;
while ($line =~ /host/g){
    $x++;
}
print "$x\n"; # 3

当您在标量上下文中运行带有/g的正则表达式时(与while语句中的条件一样),它将跟踪最后一个匹配的位置并从那里重新启动。因此,如上所述循环中的/host/g将发现每个主机的出现。您还可以在列表上下文中使用/g

my $line = "abc def host 123 host 869 host";
my @matches = $contents =~ /host/g;
print scalar @matches; # 3 again

在这种情况下,@ match将包含regexp与字符串的所有匹配,这将是('host','host','host'),因为查询是一个简单的字符串。然后,标量(@matches)将产生列表的长度。