我有以下文件
文件1:
abc def host 123 host 869 host
我写下面的脚本来计算每行中“host”关键字的出现次数。 我尝试了所有的方法(参考评论的那些)仍然似乎没有用。 sed命令在命令行中工作,但不在perl脚本中工作
imports
我是perl的初学者。寻找您宝贵的建议
答案 0 :(得分:3)
您自己的解决方案将匹配hostages
和Shostakovich
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)将产生列表的长度。