关于在Perl

时间:2015-05-04 09:04:21

标签: arrays string csv while-loop split

我有以下输入文件:

test.csv

done_cfg,,,,
port<0>,clk_in,subcktA,instA,
port<1>,,,,

我想将每个CSV列的元素存储到一个数组中,但是当我在运行脚本时尝试在csv中获取那些“null”元素时,总是会出错。这是我的代码:

# ... assuming file was correctly opened and stored into
# ... a variable named $map_in

my $counter = 0;

while($map_in){
    chomp;
    @hold_csv = split(',',$_);

    $entry1[$counter] = $hold_csv[0];
    $entry2[$counter] = $hold_csv[1];
    $entry3[$counter] = $hold_csv[2];
    $entry4[$counter] = $hold_csv[3];

    $counter++;
}
print "$entry1[0]\n$entry2[0]\n$entry3[0]\n$entry3[0]"; #test printing

每当我获取空CSV单元格时,我总是遇到use of uninitialized value错误 你能帮我找一下我代码中的错误(因为我知道我的代码有些遗漏了吗?)

感谢。

2 个答案:

答案 0 :(得分:1)

这看起来像CSV。所以工作的工具真的是Text::CSV

我还建议 - 有4个带编号名称的不同数组对我说,你可能首先想要一个多维数据结构。

所以我会做类似的事情:

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;
use Text::CSV;

my $csv = Text::CSV->new( { binary => 1 } );

open( my $input, "<", "input.csv" ) or die $!;
my @results; 

while ( my $row = $csv->getline($input) ) {
   push ( @results, \@$row );  
}

print join ( ",", @{$results[0]} ),"\n";
print Dumper \@results;
close($input);

如果你真的想要单独的数组,我建议给它们命名不同的东西,但你可以这样做:

 push ( @array1, $$row[0] );   #note - double $, because we dereference

我会注意到 - 你的代码中有错误 - 我怀疑:

while($map_in){

正在做你认为的事情。

答案 1 :(得分:0)

当您分配$entryN时,请定义默认值:

$entry1[$counter] = $hold_csv[0] || '';

与其他@entry

相同

我认为while($map_in) {中存在拼写错误while (@map_in) {