0

我有一个 Perl 脚本,它运行一个 perforce 命令并将结果存储在一个变量$command中。

然后将其存储在一个文件log.txt中,并通过使用正则表达式将相关数据取出。

当我单独运行该命令时,会弹出以下内容:

  4680 p4exp/v68     PJIANG-015394 25:34:19 IDLE none
  8869 unnamed p4-python       R integration semiconductor-project-trunktip  turbolinuxclient 01:33:52 IDLE none
  8870 unnamed p4-python       R integration remote-trunktip-osxclient 01:33:52 

代码如下:

#! /usr/bin/env perl
use strict;
use warnings;
use autodie;

my $command = qx |p4 monitor show -ale|;

open FH, '>>', "log.txt";
print FH $command;
close FH;

open my $log_fh, '<', '/root/log.txt';
my %stat;
while ($line = <$log_fh>) {
  chomp $line;
  next if not $line =~ /(\d+)\s+/;
  my $killid = $1;
  if ($line =~ /R\s+integration/ and $line =~ /IDLE\s+none$/) {
    my $killid_details = $line;
    $stat{$killid} = $killid_details;
  }
}
close $log_fh;

my $killpro;
foreach my $kill (keys %stat) {
  print "$kill\n";
}

以下获取数字 8869 但如何在没有 log.txt 的情况下执行此操作。使用数组是一种更好的方法还是散列很好?

请纠正我,因为我还在学习。

4

2 回答 2

1

似乎您的主要绊脚石正在为您的循环获取逐行输入?

在换行符上拆分应该可以解决问题:

my $killid;
my @lines = split("\n", $command); #split on newlines
for my $line (@lines) {
    next if not $line =~ /(\d+)\s+/;
    my $id = $1;
    if ($line =~ /R\s+integration/ and $line =~ /IDLE\s+none$/){
        $killid = $id;
    }
}

一个警告:您提到了 8870 的输出,但我得到的是 8869。您提供的正则表达式正在寻找带有“integration”和“IDLE none”的行,并且您的示例输入似乎与 8869 匹配。

散列很好,但如果你只使用一个键(似乎是这种情况),你也可以只使用一个变量。

于 2013-10-03T21:22:31.077 回答
1

如果您将qx构造的结果分配给数组而不是标量,那么它将自动为您拆分成行。此代码演示。

use strict;
use warnings;

my @lines = qx|p4 monitor show -ale|;

my %stat;
for my $line (@lines) {
  chomp $line;
  next unless $line =~ /(\d+)\s+/;
  my $killid = $1;
  if ($line =~ /R\s+integration/ and $line =~ /IDLE\s+none$/) {
    $stat{$killid} = $line;
  }
}

print "$_\n" for keys %stat;
于 2013-10-03T22:40:30.570 回答