我有一个运行perforce命令的Perl脚本,并将结果存储在变量$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的情况下执行此操作。使用数组是一种更好的方法,还是哈希很好?
请在我还在学习的时候纠正我。
答案 0 :(得分: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.你给的正则表达式是寻找“积分”和“IDLE none”的行,并且你的示例输入似乎与8869匹配。
哈希很好,但如果你只使用其中的一个键(似乎就是这种情况),你也可以只使用一个变量。
答案 1 :(得分: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;