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

时间:2010-09-30 12:08:26

标签: regex perl

$ 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

我应该如何进行提取?

5 个答案:

答案 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);
}