【问题标题】:Print regex match Perl打印正则表达式匹配 Perl
【发布时间】:2015-02-24 15:07:05
【问题描述】:

您好,我正在制作一个将给定关键字集与文件匹配的程序。

我想将匹配的数据输出到一个文本文件,并包含触发匹配的正则表达式关键字。

以下是与我的问题相关的代码:

my $counter = 0;
foreach($words) 
{
    while($line = <FILE>)
    {
        if($line =~ /$words/)
        {
            print "@array[$counter] $line\n";
            print OUTPUT $line;
        }
    }
    $counter ++;
}

这不会产生预期的结果。它适用于数组中的第一个元素,但对于其余元素,它只是简单地再次打印第一个元素。我相信计数器没有增加。

是否有更好/更简单的方法来获取循环中使用的当前元素?甚至获取当前的正则表达式匹配?

【问题讨论】:

    标签: arrays regex perl loops


    【解决方案1】:

    问题是&lt;FILE&gt; 耗尽了文件中的第一个单词。对于下一个单词,&lt;FILE&gt; 尝试读取文件末尾,这意味着整个循环被跳过。

    您可以在文件的循环中迭代 inside 单词,或者您可以 seek 在循环结束时回到文件的开头。

    【讨论】:

    • 感谢您的回复。获得正则表达式匹配会更容易吗?即显示 $words 中的哪些元素与 $line 匹配?没关系,我找到了一个简单的解决方案 $& 获取当前匹配项,$` 上一个和 $' 下一个。还是谢谢!
    【解决方案2】:

    这是你应该做的:

    use strict;
    use warnings;
    use 5.016;
    
    my $fname = 'data.txt';
    
    my @patterns = (
        'do.',
        '.at',
        '.ir.',
    );
    
    open my $INFILE, '<', $fname
        or die "Couldn't read from $fname: $!";
    
    while (my $line = <$INFILE>) {
        for my $pattern (@patterns) {
            if ($line =~ /($pattern)/) {
                print "$pattern --> $1";
            }
        }
    }
    
    close $INFILE:
    
    1. 在正则表达式的某些部分加上括号会导致 perl 设置匹配变量 $1、$2、$3 等,其中包含每个括号组的匹配项。

    2. $line 将在行尾有一个换行符,所以如果你写print "$line\n",你将添加另一个换行符,所以你的输出文件在你打印的每一行之间都会有空行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-20
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多