dee*_*eep 1 linux perl hash if-statement
我有一个日志文件,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
在同一个日志文件中有许多这样的条目,有些条目在末尾包含IDLE,而有些则不包含.我想保留散列中具有"R integration"和"IDLE none"的那些并忽略其余部分.我尝试了以下代码,但没有得到所需的结果.
#!/usr/bin/perl
open (FH,'/root/log.txt');
my %stat;
my ($killid, $killid_details);
while ($line = <FH>) {
if ($line =~ m/(\d+)/){
$killid = $1;
}
if ($line =~ /R integration/ and $line =~ /IDLE none/){
$killid_details = $line;
}
$stat{$killid} = {
killid => $killid_details
};
}
close (FH);
Run Code Online (Sandbox Code Playgroud)
我得到R集成的所有行(例如我得到8869,8870行),因为8870应该被忽略,所以不应该这样.
如有任何错误,请通知我.我还在学习perl.谢谢.
我在你的程序中做了一些改动:
use strict;和use warnings;.这些将捕获90%的错误.(虽然不是这个时候).or diein open my $fh, "<", $file or die qq(blah, blah, blah);或use use autodie;(现在是首选).在您的情况下,如果文件没有打开,您的程序将继续愉快地继续.您需要测试该open语句是否有效.open陈述.我使用变量作为文件句柄.这是首选,因为它不是全局的,并且更容易传递到子例程.另请注意我使用的是三个参数open.这样,如果您的文件名以某个奇怪的字符开头,则不会遇到麻烦.$killid,并$killid_details在循环内声明.这样,它们就不再存在于循环之外.IDLE none出现在您的其他位置,该怎么办?如果它在行尾,你只需要它.现在,针对您遇到的问题:
chomp阅读时需要排队.在Perl中,读取行尾的NL.该chomp命令将其删除.$killid如果您的订单已经在它的一个数字(我修改了它在该行的开头只认准位).然而,即使killid没有设定,你也只是喜欢自己的方式.在您的版本中,因为您$killid在循环之外声明,所以它在每个循环中都有一个值.如果$killid没有定义,我会转到下一个语句.这里是:
#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
use autodie;
use Data::Dumper;
open my $log_fh, '<', '/root/log.txt';
my %stat;
while (my $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;
say Dumper \%stat;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |