【问题标题】:Perforce commands Regular ExpressionsPerforce 命令正则表达式
【发布时间】:2015-03-17 03:05:50
【问题描述】:

我正在执行 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 中并使用正则表达式来获取指定的条件。但我没有得到想要的结果。

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。

请帮我解决我哪里出错了。谢谢你。

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    $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 提供了一个更易读的alternative approach

    【讨论】:

    • @感谢您指出这一点。此外,正则表达式中是否有任何技巧可以让数字大于“24”。 (我可以尝试在里面做一个 if 循环,但如果有异常)谢谢。
    • 您的意思是您希望正则表达式检查小时数是否大于 24?最好在正则表达式之外检查 (if ($hours > 24))。
    【解决方案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";
    }
    

    出于兴趣,即使您的正则表达式响应了某些内容,它也不会给您预期的 280 倍;它会给你例如117:02:40 的第 117 部分

    如果由于某种原因它必须是一个正则表达式,您可以使用 ..

    if $line =~ /^(\d+)\s+.s*sd_bordeaux\s+(\d+).*IDLE\snone$/ {
      my $id = $1;
      my $hours = $2;
    

    ...至少应该返回您期望的数字。

    【讨论】:

    • 我想使用正则表达式,因为有时日志详细信息会发生变化。谢谢。
    猜你喜欢
    • 2012-06-21
    • 2013-08-07
    • 1970-01-01
    • 2012-10-29
    • 2015-08-27
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多