Regex 在Perl中,如果模式匹配,则执行双任务
我想知道我是否可以为一个模式匹配做两件不同的事情: 我正在读取一个包含以下行的文件:Regex 在Perl中,如果模式匹配,则执行双任务,regex,perl,Regex,Perl,我想知道我是否可以为一个模式匹配做两件不同的事情: 我正在读取一个包含以下行的文件: ( 1,<2010-01-12 15:19:51.32 +0100>,<marc>,<telescope1>, (1,,,, 我正在尝试这种策略: open(FILE, "<tmpinp.txt"); while (<FILE>){ {$expstart = timelocal($6,$5,$4,$2,($3-1),$1) &&a
( 1,<2010-01-12 15:19:51.32 +0100>,<marc>,<telescope1>,
(1,,,,
我正在尝试这种策略:
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);
};
打开(文件,这个怎么样:
#!/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);
这个怎么样:
#!/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);
最清晰的方法是使用非后缀形式的,如果:
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;
}
}
或者,您可以以某种深奥的方式将这两条语句组合为一条。这对于在非常紧密的循环中对条件进行微观优化非常有用。例如,您可以使用逗号运算符组合这两个赋值:
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
将始终返回一个“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/;
}
while(){
($expstart=timelocal($6,$5,$4,$2,($3-1),$1))&($usr=$7)
如果/+1,,,。+\n/;
}
TIMTOWTDI.最清晰的方法是使用的非后缀形式,如果:
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;
}
}
或者,您可以以某种深奥的方式将这两条语句组合为一条。这对于在非常紧密的循环中对条件进行微观优化非常有用。例如,您可以使用逗号运算符组合这两个赋值:
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
将始终返回一个“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/;
}
while(){
($expstart=timelocal($6,$5,$4,$2,($3-1),$1))&($usr=$7)
如果/+1,,,。+\n/;
}
蒂姆托瓦蒂