Regex Perforce命令正则表达式
我的perforce命令执行行如下所示:Regex Perforce命令正则表达式,regex,perl,Regex,Perl,我的perforce命令执行行如下所示: 2806 I deep sd_bordeaux 117:02:40 IDLE none 2807 I deep sd_bordeaux 17:02:40 IDLE none 2808 I deep sd_coddeaux 117:02:40 IDLE all 2809 I rahul sd_coddeaux 117:02:40 IDLE all 我编写了以下代码来运行命令,以$command形式获取上面的列表,并将其存储在数组@line
2806 I deep sd_bordeaux 117:02:40 IDLE none
2807 I deep sd_bordeaux 17:02:40 IDLE none
2808 I deep sd_coddeaux 117:02:40 IDLE all
2809 I rahul sd_coddeaux 117:02:40 IDLE all
我编写了以下代码来运行命令,以$command形式获取上面的列表,并将其存储在数组@lines中,并使用regex获取指定的条件。但是我没有得到想要的结果
my $command = qx |p4 monitor show -ale|;
my $kill_id;
my @lines = split("\n", $command);
for my $line (@lines){
next if not $line =~ /(\d+)\s+/;
my $id = $1;
if ($line =~ /sd_bordeaux\s+(\d+):\d+:\d+\s+/ and $line =~ /IDLE\s+none$/){
my $hours = $1;
print "$hours";
print "\n";
}
}
我犯了一个错误
Use of uninitialized value $hours in string at ./p4.pl
我有兴趣将数字“2806”和“2807”作为$id,将第一个数字“117”和“17”作为$hours
请问我哪里出了问题。多谢各位 既然数据如此有序,为什么还要使用正则表达式呢
for my $line (@lines) {
my @elems = split /\s+/, $line;
next unless $elems[3] eq "sd_bordeaux";
next unless $elems[-2] eq "IDLE";
next unless $elems[-1] eq "none";
print "$elems[0]\n";
}
出于兴趣,即使你的正则表达式有回应,它也不会给你期望的280x;它会给你例如117:02:40的117部分
如果出于某种原因它必须是正则表达式,你可以用
if $line =~ /^(\d+)\s+.s*sd_bordeaux\s+(\d+).*IDLE\snone$/ {
my $id = $1;
my $hours = $2;
。。。这至少应该返回您期望的数字。既然数据如此有序,为什么还要使用正则表达式呢
for my $line (@lines) {
my @elems = split /\s+/, $line;
next unless $elems[3] eq "sd_bordeaux";
next unless $elems[-2] eq "IDLE";
next unless $elems[-1] eq "none";
print "$elems[0]\n";
}
出于兴趣,即使你的正则表达式有回应,它也不会给你期望的280x;它会给你例如117:02:40的117部分
如果出于某种原因它必须是正则表达式,你可以用
if $line =~ /^(\d+)\s+.s*sd_bordeaux\s+(\d+).*IDLE\snone$/ {
my $id = $1;
my $hours = $2;
。。。这至少应该返回您期望的数字。既然数据如此有序,为什么还要使用正则表达式呢
for my $line (@lines) {
my @elems = split /\s+/, $line;
next unless $elems[3] eq "sd_bordeaux";
next unless $elems[-2] eq "IDLE";
next unless $elems[-1] eq "none";
print "$elems[0]\n";
}
出于兴趣,即使你的正则表达式有回应,它也不会给你期望的280x;它会给你例如117:02:40的117部分
如果出于某种原因它必须是正则表达式,你可以用
if $line =~ /^(\d+)\s+.s*sd_bordeaux\s+(\d+).*IDLE\snone$/ {
my $id = $1;
my $hours = $2;
。。。这至少应该返回您期望的数字。既然数据如此有序,为什么还要使用正则表达式呢
for my $line (@lines) {
my @elems = split /\s+/, $line;
next unless $elems[3] eq "sd_bordeaux";
next unless $elems[-2] eq "IDLE";
next unless $elems[-1] eq "none";
print "$elems[0]\n";
}
出于兴趣,即使你的正则表达式有回应,它也不会给你期望的280x;它会给你例如117:02:40的117部分
如果出于某种原因它必须是正则表达式,你可以用
if $line =~ /^(\d+)\s+.s*sd_bordeaux\s+(\d+).*IDLE\snone$/ {
my $id = $1;
my $hours = $2;
。。。这至少应该返回您期望的数字。
$1
包含最近成功的正则表达式匹配的第一次捕获所匹配的内容
当您收到错误时,最近的成功匹配是针对不包含捕获的/IDLE\s+none$/
以下内容相当:
if ($line =~ /sd_bordeaux\s+(\d+):\d+:\d+\s+/) {
my $hours = $1;
if ($line =~ /IDLE\s+none$/) {
print "$hours\n";
}
}
但看起来您所需要的只是以下内容:
if ($line =~ /sd_bordeaux\s+(\d+):\d+:\d+\s+IDLE\s+none$/) {
my $hours = $1;
print "$hours\n";
}
这解释了问题以及如何解决问题,但是Garry提供了一个更具可读性的方法。
$1
包含了与最近成功的正则表达式匹配的第一个捕获匹配的内容
当您收到错误时,最近的成功匹配是针对不包含捕获的/IDLE\s+none$/
以下内容相当:
if ($line =~ /sd_bordeaux\s+(\d+):\d+:\d+\s+/) {
my $hours = $1;
if ($line =~ /IDLE\s+none$/) {
print "$hours\n";
}
}
但看起来您所需要的只是以下内容:
if ($line =~ /sd_bordeaux\s+(\d+):\d+:\d+\s+IDLE\s+none$/) {
my $hours = $1;
print "$hours\n";
}
这解释了问题以及如何解决问题,但是Garry提供了一个更具可读性的方法。
$1
包含了与最近成功的正则表达式匹配的第一个捕获匹配的内容
当您收到错误时,最近的成功匹配是针对不包含捕获的/IDLE\s+none$/
以下内容相当:
if ($line =~ /sd_bordeaux\s+(\d+):\d+:\d+\s+/) {
my $hours = $1;
if ($line =~ /IDLE\s+none$/) {
print "$hours\n";
}
}
但看起来您所需要的只是以下内容:
if ($line =~ /sd_bordeaux\s+(\d+):\d+:\d+\s+IDLE\s+none$/) {
my $hours = $1;
print "$hours\n";
}
这解释了问题以及如何解决问题,但是Garry提供了一个更具可读性的方法。
$1
包含了与最近成功的正则表达式匹配的第一个捕获匹配的内容
当您收到错误时,最近的成功匹配是针对不包含捕获的/IDLE\s+none$/
以下内容相当:
if ($line =~ /sd_bordeaux\s+(\d+):\d+:\d+\s+/) {
my $hours = $1;
if ($line =~ /IDLE\s+none$/) {
print "$hours\n";
}
}
但看起来您所需要的只是以下内容:
if ($line =~ /sd_bordeaux\s+(\d+):\d+:\d+\s+IDLE\s+none$/) {
my $hours = $1;
print "$hours\n";
}
这就解释了问题以及如何解决问题,但是Garry提供了一个更具可读性的方法。@谢谢您指出这一点。另外,在正则表达式中是否有任何技巧可以使数字大于24。(我可以尝试在内部执行if循环,但如果出现异常)谢谢。你是说你想让正则表达式检查小时数是否大于24小时?最好在正则表达式之外检查(
if($hours>24)
)。@感谢您指出这一点。另外,正则表达式中是否有任何技巧可以获得大于24的数字。(我可以尝试在内部执行if循环,但如果出现异常)谢谢。你是说你想让正则表达式检查小时数是否大于24小时?最好在正则表达式之外检查(if($hours>24)
)。@感谢您指出这一点。另外,正则表达式中是否有任何技巧可以获得大于24的数字。(我可以尝试在内部执行if循环,但如果出现异常)谢谢。你是说你想让正则表达式检查小时数是否大于24小时?最好在正则表达式之外检查(if($hours>24)
)。@感谢您指出这一点。另外,正则表达式中是否有任何技巧可以获得大于24的数字。(我可以尝试在内部执行if循环,但如果出现异常)谢谢。你是说你想让正则表达式检查小时数是否大于24小时?最好在regex之外检查(if($hours>24)
)。我想使用regex,因为有时候日志细节会发生变化。谢谢。我想使用正则表达式,因为有时日志细节会发生变化。谢谢。我想使用正则表达式,因为有时日志细节会发生变化。谢谢。我想使用正则表达式,因为有时日志细节会发生变化。非常感谢。