我是perl的新手,但不是脚本语言。我有一个文件,我试图只提取与正则表达式匹配的每一行的一部分。例如,给定文件:
FLAG(123)
FLAG(456)
Not a flag
FLAG(789)
我想提取清单[123,456,789]
正则表达式显然是/^FLAG\((\w+)/
。我的问题是,在perl中提取这些数据的简单方法是什么?
设置一个循环并进行一堆=~
匹配显然并不难,但是我已经听过很多关于perl的简洁性以及它如何拥有一个运算符的所有内容,所以我想知道是否有一种灵活,简单的方法来做到这一点。
另外,你能指出一个好的perl参考资料吗?我可以在下次出现机会时找到光滑的方法做其他事情吗?网上有很多perl资源,但其中90%太简单了,另外10%我似乎在噪音中丢失信号。
谢谢!
答案 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+)/;
}
值得指出的事情是:
while
循环条件下(仅在while循环条件下),从文件句柄中读取将值设置为$_
并检查文件是否已自动读取。if
,unless
,for
,foreach
,while
或until
附加到最后来修改声明它的。然后它作为一个语句的条件或循环。$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');