我有一个数据,并喜欢使用Perl脚本执行简单的while
操作。
以下是数据集中的一个小提取:
“号码”, “代码”, “国家”, “伽马”, “X1”, “X2”, “X 3”, “X4”, “X5”, “X6” 1, “DZA”, “阿尔及利亚”, “0.01”,7.44,47.3,0.46,0,0,0.13 2, “前”, “安哥拉”, “0.00”,6.79 “NULL”,0.21,1,0,0.28 3, “奔”, “贝宁”, “ - 0.01”,7.02,38.9,0.27,1,0,0.05 4, “BWA”, “波扎那”, “0.06”,6.28,45.7,0.42,1,0,0.07 5,“HVO”,“Burkina Faso”,“0.00”,6.15,36.3,0.08,1,0,0.05 6, “BDI”, “蒲隆地”, “0.00”,6.38,41.8,0.18,1,0,0
脚本应计算每个,
分隔字段的长度并存储最高值
成阵列。
但是,保存无法正常工作。以下是代码的一部分:
@maxl = map length, @terms;
while(`<INFILE>`) {
$_ =~ s/[\"\n]//g ;
@terms = split/$sep/, $_;
@lengths = map length, @terms;
for($k = 0, $k <= $#terms, $k++) {
if($lengths[$k] > $maxl[$k]) {
$maxl[$k] = $lenghts[$k];
}
}
print "@lengths\n";
}
现在@maxl
使用代码中的早期部分,它使用数据集的第二行。
当我使用print
命令只是为了查看我得到的@maxl
操作的值:
1 3 7 4 4 4 4 1 1 5
在while
循环中我使用另一个print
语句只是为了查看其他值,我得到:
1 3 6 4 4 4 4 1 1 4
1 3 5 5 4 4 4 1 1 4
1 3 8 4 4 4 4 1 1 4
1 3 12 4 4 4 4 1 1 4
1 3 7 4 4 4 4 1 1 1
1 3 8 4 4 4 4 1 1 4
1 3 10 4 4 4 4 1 1 4
1 3 16 5 4 4 4 1 1 4
2 3 4 5 3 4 4 1 1 4
2 3 7 4 4 4 4 1 1 4
2 3 5 4 4 4 4 1 1 4
2 3 5 4 4 4 4 1 1 4
2 3 8 4 4 4 4 1 1 4
2 3 5 4 4 4 1 1 1 4
第四列显然具有大于3的值。while
循环应该保存最大值并将这些值替换为@maxl
。
出了什么问题?
...在for
循环中,逗号错误
for($k = 0, $k <= $#terms, $k++)
然而,在清理之后,似乎仍然存在问题...
答案 0 :(得分:9)
这里有一个错字
$maxl[$k] = $lenghts[$k];
对于初学者('使用严格'会抓住)
考虑使用Text::CSV更可靠地解析逗号分隔数据(它还可以处理其他分隔符):
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV->new();
my @max_lengths;
while ( my $line = <INFILE> ) {
die "Unable to parse '$line'" unless $csv->parse($line);
my @column_lengths = map { length } $csv->fields();
for my $i ( 0 .. $#column_lengths ) {
if ( $column_lengths[$i] > ($max_lengths[$i] || 0) ) {
$max_lengths[$i] = $column_lengths[$i];
}
}
}
print "MAX LENGTHS OF EACH FIELD: @max_lengths\n";