Как мне выполнить общие назначения шаблонов в Perl? - PullRequest
1 голос
/ 30 сентября 2010
$ 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);
}

Я хочу, чтобы temp имел соответственно

jan
feb
march
monday

.

Шаблон всегда остается неизменным

projectname_flag_<>temp

Как мне сделать экстракцию?

Ответы [ 5 ]

7 голосов
/ 30 сентября 2010

Если требуется совместимость со старыми perl s, я бы использовал FM-ответ (просто убедитесь, что совпадение прошло успешно, проверив, определено ли $month).

По состоянию на5.10, вы можете использовать именованные захваты:

my $month;
if ( /^ projectname _flag_ (?<month> [a-z]+ ) temp \z/x ) {
    $month = $+{month};
}
7 голосов
/ 30 сентября 2010
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 голос
/ 30 сентября 2010
while (<$fpi>) {
        chomp;
        s{projectname_flag_(.*?)temp}{$1};
        # $_ will now have jan, feb, ...
}
0 голосов
/ 30 сентября 2010
while (<$fpi>) {
  my ($temp) =($_ =~ m/projectname_flag_(.*?)temp/);
  func($temp);
}
0 голосов
/ 30 сентября 2010

Я думаю:

/^projectname_flag_([a-z]+)temp$/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...