如何在Perl中执行常规模式分配?

Laz*_*zer 1 regex perl

$ cat names
projectname_flag_jantemp
projectname_flag_febtemp
projectname_flag_marchtemp
projectname_flag_mondaytemp
$
Run Code Online (Sandbox Code Playgroud)

Perl代码:

my $infile = "names";
open my $fpi, '<', $infile or die "$!";
while (<$fpi>) {
    my $temp = # what should come here? #
    func($temp);
}
Run Code Online (Sandbox Code Playgroud)

我想要临时拥有

jan
feb
march
monday
Run Code Online (Sandbox Code Playgroud)

分别.

模式始终保持不变

projectname_flag_<>temp
Run Code Online (Sandbox Code Playgroud)

我该怎么做提取?

FMc*_*FMc 7

my ($temp) = /^projectname_flag_(.+)temp$/;
Run Code Online (Sandbox Code Playgroud)

请注意,$temp需要括号,以便模式匹配在列表上下文中运行.如果没有它们,$temp最终将只包含一个表示匹配是否成功的true或false值.

更一般地,列表上下文中的模式匹配返回捕获的子模式(如果匹配失败,则返回空列表).例如:

my $str = 'foo 123   456 bar';
my ($i, $j) = $str =~ /(\d+) +(\d+)/;  # $i==123  $j==456
Run Code Online (Sandbox Code Playgroud)


Sin*_*nür 7

如果perl需要与旧版本的兼容性,我会使用FM的答案(只需通过检查是否$month已定义来确保匹配成功).

从5.10开始,您可以使用命名捕获:

my $month;
if ( /^ projectname _flag_ (?<month> [a-z]+ ) temp \z/x ) {
    $month = $+{month};
}
Run Code Online (Sandbox Code Playgroud)