【问题标题】:how to count a repeating string in a line using perl如何使用perl计算一行中的重复字符串
【发布时间】:2018-01-07 06:01:59
【问题描述】:

我有以下文件

文件1:

abc def 主机 123 主机 869 主机

我编写了下面的脚本来计算每行中“主机”关键字的出现次数。 我尝试了所有方法(参考那些被评论的方法)但它似乎不起作用。 sed 命令在命令行中有效,但在 perl 脚本中无效

#!/usr/bin/perl
open(SOURCE,"</home/amp/surevy01/file1");
open(DESTINATION,"</home/amp/surevy01/file2");
while(my $line = <SOURCE>)
    {
  while(my $line1 = <DESTINATION>)
     {
        #chomp($line);
        #chomp($line1);
            if ($line =~ "host")
            {
            #my $count = grep {host} $line;
            #my $count = `sed -i {s/host/host\n/g} $line1 | grep -c {host}`;
            #my $count = `perl -pi -e 's/host/host\n/g' $line1 | grep -c host`;
            #my $count grep ("host" ,$line);
            print "$count";
            print "match found \n";
            next;
            }
           else
            {
               print "match not found \n";
               exit;
            }
      }
    }

我是 perl 的初学者。期待您的宝贵建议

【问题讨论】:

  • 这是一个离题的评论,但是:您应该使用带有词法文件句柄的 3 参数 open 并检查是否成功(如在 open( my $fh_in, '&lt;', $filename) or die "cannot open $filename: $!\n" 中)并且您应该'不要命名只读文件句柄DESTINATION。这只会在以后让您(和其他人)感到困惑。请始终use strict; use warnings;

标签: perl


【解决方案1】:

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

grep 是计算列表元素的规范方法,split 会将您的行变成单词列表,给出

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

【讨论】:

    【解决方案2】:

    我不知道您为什么在示例中循环遍历两个文件,但您可以使用 /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
    

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

    【讨论】:

    • 您可能希望/\bhost\b/ 避免匹配hosting
    【解决方案3】:

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

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

    但这也匹配hosting。为避免这种情况,以下方法可能会奏效:

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

    =()= 这称为 Perl 秘密 Goatse 运算符。更多info

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-28
      • 2016-05-20
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      相关资源
      最近更新 更多