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