所以我尝试用下面的代码来做的就是推送一个字符串,让我们把"this string“放到散列中每个键的末尾。我完全不知道该怎么做。下面是我的代码:
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;
其中"this string“是我试图将该字符串推送到数组末尾的位置。然而,最终的结果是它打印了三次"this string“,而不是像我想要的那样打印在每个键的末尾。当我试图将它放在while()循环之外时,它告诉我$key的值没有初始化。所以,有什么帮助吗?如果你需要澄清我的问题,尽管告诉我。谢谢!
发布于 2012-07-20 13:47:52
无意冒犯,但这段代码中有太多问题,我甚至不知道从哪里开始……
首先,“initialization block”(此脚本开头的所有这些my $something; my @somethings
行)在Perl中不是必需的。事实上,它不仅仅是“多余的”--它实际上是令人困惑的:每当我遇到一个新的变量时,我不得不来回移动我的焦点,仅仅是为了检查它的类型。此外,即使有了所有这些,$input
变量仍然没有声明为本地变量;它要么在注释中丢失,要么给出的代码有遗漏。
其次,为什么你声明你打算使用File::Find (很好)--但又根本不使用它?它可以极大地简化所有这些while(glob) { while(<FH>) { ... } }
例程。
第三,我不确定为什么仅当读取的代码行与/File/匹配时才将某些内容赋值给$key
-但是在其他所有情况下都使用它的值作为键。这是不是试图读取按部分组织的文件?然后,它可以更简单地完成,通过slurp/拆分或本地化$/
变量……
无论如何,重点是如果扫描的文件的第一行与/File/
不匹配,则前一行(即来自前一文件!)值被使用了--我不太确定它是不是有意的。如果第一个文件的第一行不是/File/
-matched,则使用空字符串作为键-同样,它闻起来像是一个bug……
你能更详细地描述一下你的任务吗?给出一些测试输入/输出结果,也许...在短任务中进行,在进程中组织您的代码将是很棒的。
发布于 2012-07-20 14:47:20
你的程序构思不周,违反了很多好的实践规则。下面是一个具有更好结构的等效程序,而不是全部枚举。
我想知道您是否知道所有的if
语句都将被测试并可能被执行?也许您需要使用elsif
除了在使用时$key可能是未定义的,您还将$xmlfile
设置为$1
,这将永远不会被定义,因为您的任何正则表达式中没有捕获。
从你的代码中不可能知道你想做什么,所以只有当你向我们展示你的输出,输入,并告诉我们如何从一个派生出另一个的时候,我们才能帮助你。
use strict;
use warnings;
use File::Find;
my ($outfile) = @ARGV;
my $dir = 'c:/programs/TEST/Test';
my %hoa;
my $key;
while (my $input = glob "$dir/*.txt") {
open my $in, '<', $input or die $!;
while (<$in>) {
chomp;
if (/File/) {
my $key = (split /:/)[1];
push @{ $hoa{$key} }, "Filename\n";
}
if (/XML/ ... /File/) {
my $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";
}
close $in;
}
open my $out, '>', $outfile or die $!;
foreach my $k (keys %hoa) {
foreach my $l (@{ $hoa{$k} }) {
print $out $l, "\n";
}
}
close $out;
发布于 2012-07-20 13:47:26
根据您的代码,我怀疑设置了$key的行不会在每次循环中都被调用,并且您不会触发任何其他if语句。
这会将"this string“附加到数组的末尾。根据您在数组末尾得到的3个"this string“,我怀疑有两行没有经过if (/FILE/)或任何其他if语句。这将使$key值保持不变,最后,您将使用设置时$key的最后一个值将"this string“附加到数组中。
https://stackoverflow.com/questions/11580305
复制