因此,我尝试使用以下代码执行操作:将一个字符串(例如“此字符串”)压入哈希中每个键的末尾。我完全为如何做到这一点而烦恼。这是我的代码:
use warnings;
use strict;
use File::Find;
my @name;
my $filename;
my $line;
my @severity = ();
my @files;
my @info = ();
my $key;
my %hoa;
my $xmlfile;
my $comment;
my @comments;
open( OUTPUT, "> $ARGV[0]" );
my $dir = 'c:/programs/TEST/Test';
while ( defined( $input = glob( $dir . "\\*.txt" ) ) ) {
open( INPUT, "< $input" );
while (<INPUT>) {
chomp;
if (/File/) {
my @line = split /:/;
$key = $line[1];
push @{ $hoa{$key} }, "Filename\n";
}
if ( /XML/ ... /File/ ) {
$xmlfile = $1;
push @{ $hoa{$key} }, "XML file is $xmlfile\n";
}
if (/Important/) {
push @{ $hoa{$key} }, "Severity is $_\n";
}
if (/^\D/) {
next if /Important/;
push @{ $hoa{$key} }, "Given comment is $_\n";
}
push @{ $hoa{$key} }, "this string\n";
}
}
foreach my $k ( keys %hoa ) {
my @list = @{ $hoa{$k} };
foreach my $l (@list) {
print OUTPUT $l, "\n";
}
}
}
close INPUT;
close OUTPUT;
我有“此字符串”的地方就是我试图将该字符串推送到数组末尾的地方。但是,最终发生的事情是,它最终打印了“此字符串”三遍,而不是在我想要的每个键的末尾。当我尝试将其放置在while()循环之外时,它表示$ key的值未初始化。所以请帮忙吗?如果您需要我所要澄清的任何地方,请告诉我。谢谢!
最佳答案
没有违法行为,但是这段代码有很多问题,我什至不知道从哪里开始...
首先,Perl中不需要“初始化块”(此脚本开头的所有这些my $something; my @somethings
行)。实际上,这不仅是“多余的”,而且还很令人困惑:每次遇到新变量时,我都必须反复检查自己的焦点,以检查其类型。此外,即使所有这些$input
var仍未声明为本地;它或者在注释中丢失,或者给出的代码有遗漏。
其次,为什么要声明打算使用File::Find(好),但是却根本不使用它?它可以大大简化所有while(glob) { while(<FH>) { ... } }
例程。
第三,我不确定为什么仅当读取的行与/ File /匹配时才为$key
分配某些内容,但是在所有其他情况下都将其值用作键。这是尝试读取按部分组织的文件吗?然后可以通过吸取/拆分或本地化$/
变量来简化一些工作...
无论如何,关键是如果扫描的文件的第一行与/File/
不匹配,则使用前一个(即来自前一个文件!)的值-我不确定这是否是预期的。并且如果第一个文件的第一行与/File/
不匹配,则将一个空字符串用作键-再次,它闻起来像个bug。
您能否详细描述您的任务?给出一些测试输入/输出结果,也许...最好执行简短的任务,在过程中组织代码。
关于perl - 插入Perl中的哈希结束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11580305/