Perl提取物匹配列表

时间:2011-10-05 18:40:41

标签: perl

我是perl的新手,但不是脚本语言。我有一个文件,我试图只提取与正则表达式匹配的每一行的一部分。例如,给定文件:

FLAG(123)
FLAG(456)
Not a flag
FLAG(789)

我想提取清单[123,456,789]

正则表达式显然是/^FLAG\((\w+)/。我的问题是,在perl中提取这些数据的简单方法是什么?

设置一个循环并进行一堆=~匹配显然并不难,但是我已经听过很多关于perl的简洁性以及它如何拥有一个运算符的所有内容,所以我想知道是否有一种灵活,简单的方法来做到这一点。

另外,你能指出一个好的perl参考资料吗?我可以在下次出现机会时找到光滑的方法做其他事情吗?网上有很多perl资源,但其中90%太简单了,另外10%我似乎在噪音中丢失信号。

谢谢!

3 个答案:

答案 0 :(得分:2)

以下是我将如何做到这一点......您是否学到了新的和/或有用的东西?

my $file_name = "somefile.txt";
open my $fh, '<', $file_name or die "Could not open file $file_name: $!";

my @list;
while (<$fh>)
{
    push @list, $1 if /^FLAG\((\w+)/;
}
值得指出的事情是:

  1. while循环条件下(仅在while循环条件下),从文件句柄中读取将值设置为$_并检查文件是否已自动读取。
  2. 可以通过将ifunlessforforeachwhileuntil附加到最后来修改声明它的。然后它作为一个语句的条件或循环。
  3. 您可能知道正则表达式捕获组存储在$1$2等中,但即使语句具有if,您也可能不知道该语句将起作用后缀。首先会对if进行评估,因此push @list, $1 if /some_regex/会有意义并且会先进行匹配,然后在$1语句中需要push之前进行分配。

答案 1 :(得分:2)

假设您将所有数据放在一个字符串中:

my @matches = $data =~ /^FLAG\((\w+)/mg;

/g修饰符表示匹配尽可能多的次数,/m使^匹配任何换行符后(不仅在字符串的开头)和列表中的匹配项context返回所有匹配项的所有捕获。

如果您逐行阅读数据,那么Platinum Azure的解决方案就是您想要的解决方案。

答案 2 :(得分:1)

map是你的朋友。

use strict;
use warnings;
use File::Slurp;

my @matches = map { /^FLAG\((\w+)/ } read_file('file.txt');