我想读取一个由空格分隔的.txt文件,逐行存储并将其存储在perl的散列中

时间:2015-06-30 07:30:35

标签: perl hash text-files

我使用了以下代码:

print "Enter the log file name \n";
chomp (my $log_file = <STDIN>);
my %log_hash ;
open(my $log, "<$log_file") or die "Can't open file";
while ( my $log_line = <$log> ) {
    chomp($log_line);
    my($log_key,$log_val) = split(" ", $log_line,2);
    print $log_key , "\n";
    print $log_val , "\n";
    $log_hash{$log_key} = $log_val;
    print $log_hash{$log_key};

}

当我运行它时,我看到只打印了最后一行。其余值不在log_hash中。 我该如何纠正这个问题?

我试过这段代码,但仍然遇到同样的问题 日志文件:

instance_73 434 641
instance_83 428 635
instance_56 434 640...

我也使用代码打开命令文件 cmd文件:

CMD_1 447 632
CMD_2 449 643
CMD_3 434 632...

这没有问题。命令文件给出了预期的结果(键和值互换),但是对于日志文件,只存储了最后一行。

这是日志文件的结果:

...instance_91
446 631
instance_61
442 631
instance_40
448 647
448 647

这是针对命令文件:

447 632
CMD_1
CMD_1
449 643
CMD_2
CMD_2
434 632
CMD_3
CMD_3...

3 个答案:

答案 0 :(得分:1)

如果没有一些样本输入,很难说清楚。然而,最可能的原因是哈希需要唯一的密钥,并且您的日志文件可能不会提供这些密钥。

考虑一个日志:

today some message
today another message
today some more messages

这些都将被插入到哈希元素today中,并且每个都将相互覆盖。

检查这是否正在发生:

push (  @{$log_hash{$log_key}, $log_val );

然后使用Data::Dumper查看:

print Dumper \%log_hash;

答案 1 :(得分:1)

您的代码正常运行,我只是改变了风格。请检查以下代码:

use strict;
use warnings;

print "Enter the log file name: ";
chomp (my $log_file = <STDIN>);
my %log_hash;
open my $log, "<", "$log_file" or die "Can't open file: $!";
while ( my $log_line = <$log> )
{
    chomp $log_line;
    my($log_key, $log_val) = split(" ", $log_line, 2);
    print $log_key, "\n";
    print $log_val, "\n";
    $log_hash{$log_key} = $log_val;
    print $log_hash{$log_key}, "\n";
}
close $log;

考虑您撰写的输入数据。

logfile输出:

instance_73
434 641
434 641
instance_83
428 635
428 635
instance_56
434 640
434 640

cmdfile输出:

CMD_1
447 632
447 632
CMD_2
449 643
449 643
CMD_3
434 632
434 632

答案 2 :(得分:0)

请检查以下代码:

Dim strMsg As String
strMsg = "<script language=javascript> alert('Hi'); </script>"
Page.RegisterStartupScript("alert", strMsg)