双任务如果模式在Perl中匹配



i如果我可以为单个模式匹配做2件不同的事情:我正在阅读带有以下行的文件:

(   1,<2010-01-12 15:19:51.32 +0100>,<marc>,<telescope1>,

我正在尝试这种策略:

open(FILE, "<tmpinp.txt");  
while (<FILE>){
    {$expstart = timelocal($6,$5,$4,$2,($3-1),$1) && $usr=$7} if
          /.+1,<(d{4})-(d{2})-(d{2})s(d{2}):(d{2}):(d{2}).*>,<(S+)>,<(S+)>.+n/;
    };
close(FILE);
};

因此,我想获得时代的时间和用户名(此示例中的MARC)在一次运行。它只是不起作用。任何帮助!?

thanx很多!

最清晰的方法是使用 if的非postfix形式:

while (<FILE>){
   if (/.+1,<(d{4})-(d{2})-(d{2})s(d{2}):(d{2}):(d{2}).*>,<(S+)>,<(S+)>.+n/) {
      # this is a block; you can put as many statements in here as you want
      $expstart = timelocal($6,$5,$4,$2,($3-1),$1);
      $usr = $7;
   }
}

如果您真的要出于某种原因真正想使用Postfix if,那么您仍然可以与块一起使用,这要归功于do

while (<FILE>){
   do {
      # this is a block; you can put as many statements in here as you want
      $expstart = timelocal($6,$5,$4,$2,($3-1),$1);
      $usr = $7;
   } if /.+1,<(d{4})-(d{2})-(d{2})s(d{2}):(d{2}):(d{2}).*>,<(S+)>,<(S+)>.+n/;
}

或者您可以以某种深奥的方式将这两个语句组合为一个语句。这对于在非常紧密的循环中的微观挑选条件可能很有用。例如,您可以使用逗号运算符将两个作业结合在一起:

while (<FILE>){
   ($expstart = timelocal($6,$5,$4,$2,($3-1),$1)), ($usr = $7)
      if /.+1,<(d{4})-(d{2})-(d{2})s(d{2}):(d{2}):(d{2}).*>,<(S+)>,<(S+)>.+n/;
}

或者如果您知道timelocal将始终返回单个标量值(绝不是零列表,或一个以上值),则可以使用列表分配来设置$expstart$usr

while (<FILE>){
   ($expstart, $usr) = (timelocal($6,$5,$4,$2,($3-1),$1), $7)
      if /.+1,<(d{4})-(d{2})-(d{2})s(d{2}):(d{2}):(d{2}).*>,<(S+)>,<(S+)>.+n/;
}

,或者如果您知道timelocal将始终返回一个" true"值(即0或空字符串或Undef),则可以在尝试时使用&&

while (<FILE>){
   ($expstart = timelocal($6,$5,$4,$2,($3-1),$1)) && ($usr = $7)
      if /.+1,<(d{4})-(d{2})-(d{2})s(d{2}):(d{2}):(d{2}).*>,<(S+)>,<(S+)>.+n/;
}

timtowtdi。

怎么样:

#!/usr/bin/perl                                                                                                                                                                                                                                                
use strict;
use warnings;
use Time::Local;
open(FILE, "<tmpinp.txt");
while (<FILE>){
    if ($_ =~ /^.+1,<(d{4})-(d{2})-(d{2})s(d{2}):(d{2}):(d{2}).*?>,<(S+)>,<(S+)>.+$/) {
        print join(' => ', timelocal($6,$5,$4,$2,$3-1,$1), $7) . "n";
    }
}
close(FILE);

打印:

1291213191 => marc

最新更新