我有一个Perl脚本,它解析数据文件并写入5个输出文件,填充1100 x 1300网格。剧本的作品,但在我看来,这是笨拙的,可能是无效的。该脚本也是继承代码,我修改了一些代码以使其更具可读性。尽管如此,这是一团糟。如何用Perl高效填充N×M网格?
目前,该脚本读取数据文件(〜4MB),并将其放入数组。然后循环遍历数组解析其内容并将值推送到另一个数组,最后将其打印到另一个for循环中。如果某个点没有找到值,则打印9999.零点是可接受的值。
数据文件有5个不同的参数和他们每个人被写入其自身的文件。数据的
实施例:
data for the param: 2
5559
// (x,y) count values
280 40 3 0 0 0
280 41 4 0 0 0 0
280 42 5 0 0 0 0 0
281 43 4 0 0 10 10
281 44 4 0 0 10 10
281 45 4 0 0 0 10
281 46 4 0 0 10 0
281 47 4 0 0 10 0
281 48 3 10 10 0
281 49 2 0 0
41 50 3 0 0 0
45 50 3 0 0 0
280 50 2 0 0
40 51 8 0 0 0 0 0 0 0 0
...
data for the param: 3
3356
// (x,y) count values
是数据线到当前参数的数目。数据线变为:X,ÿ,数量的连续的x值该特定点和最后值的。 参数之间有空行。
正如我刚才所说,剧本的作品,但我觉得这可能是这样做更容易,更有效。我只是不知道如何。所以这是一个自我提升的机会。
会是什么这个问题更好的办法,比阵列和for循环一个复杂的组合?
编辑:
应该更清楚这一点,不好意思。
输出是1100 X 1300网格填充有从数据文件中读取的值。每个参数写入不同的文件。数据行上的多个值意味着该行具有x(+ n),y个点的数据。
UPDATE:
我测试的解决方案,让我吃惊的是比原来的脚本(〜3秒)慢。但是,该脚本的体积缩小了大约50%,这使得更容易理解脚本的功能。在这种情况下,这比速度增加3秒更重要。
这里有一些旧脚本的代码。希望你能从中得到基本的想法。为什么它更快?
for my $i (0..$#indata) { # Data file is read to @indata
...
if($indata[$i] =~ /^data for the param:/) {
push @block, $i; # data borders aka. lines, where block starts and ends
}
...
}
# Then handle the data blocks
for my $k (0..4) { # 5 parameters
...
if($k eq '4') { # Last parameter
$enddata = $#indata;
}
else {
$enddata = $block[$k+1];
}
...
for my $p ($block[$k]..$enddata) { # from current block to next block
...
# Fill data array
for(my $m=0 ; $m<$n ; $m++){
$data[$x][$y] = $values[$m];
}
}
print2file();
}
是否有可能在此发布部分代码?至少执行你描述的处理的部分? – Sagar 2010-10-22 13:42:53
此外,您不会在输出文件中描述您想要的内容!在这种情况下,每个坐标的多个值的含义是什么?描述你的输入,但不是你想要达到的目标对于一个问题来说毫无用处。 – tsee 2010-10-22 13:54:05