$ cat names
projectname_flag_jantemp
projectname_flag_febtemp
projectname_flag_marchtemp
projectname_flag_mondaytemp
$
Perl代码:
my $infile = "names";
open my $fpi, '<', $infile or die "$!";
while (<$fpi>) {
my $temp = # what should come here? #
func($temp);
}
我想要临时拥有
jan
feb
march
monday
分别
模式始终保持不变
projectname_flag_<>temp
我应该如何进行提取?
答案 0 :(得分:7)
my ($temp) = /^projectname_flag_(.+)temp$/;
请注意,需要$temp
周围的括号,以便模式匹配在列表上下文中运行。如果没有它们,$temp
最终将只包含一个表示匹配是否成功的true或false值。
更一般地说,列表上下文中的模式匹配返回捕获的子模式(如果匹配失败,则返回空列表)。例如:
my $str = 'foo 123 456 bar';
my ($i, $j) = $str =~ /(\d+) +(\d+)/; # $i==123 $j==456
答案 1 :(得分:7)
如果需要与较早的perl
兼容,我会使用FM's answer(只需通过检查是否已定义$month
来确保匹配成功。)
从5.10开始,您可以使用命名捕获:
my $month;
if ( /^ projectname _flag_ (?<month> [a-z]+ ) temp \z/x ) {
$month = $+{month};
}
答案 2 :(得分:1)
while (<$fpi>) {
chomp;
s{projectname_flag_(.*?)temp}{$1};
# $_ will now have jan, feb, ...
}
答案 3 :(得分:0)
我想:
/^projectname_flag_([a-z]+)temp$/
答案 4 :(得分:0)
while (<$fpi>) {
my ($temp) =($_ =~ m/projectname_flag_(.*?)temp/);
func($temp);
}