Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perforce命令正则表达式_Regex_Perl - Fatal编程技术网

Regex 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

我的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形式获取上面的列表,并将其存储在数组@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,因为有时候日志细节会发生变化。谢谢。我想使用正则表达式,因为有时日志细节会发生变化。谢谢。我想使用正则表达式,因为有时日志细节会发生变化。谢谢。我想使用正则表达式,因为有时日志细节会发生变化。非常感谢。