2010-07-07 43 views
7

我試圖從CSV文件中打印所有數組值。我有點在下面的例子中手動做這個。無論有多少個字段,有人可以向我展示爲數組的所有字段執行此操作的代碼嗎?我基本上只是試圖在一個新行上打印每個字段。如何在Perl中打印數組的所有值

#!/usr/bin/perl 
use strict; 
use warnings; 
use Text::CSV_XS; 

my $file = 'test.csv'; 

my $csv = Text::CSV_XS->new ({ 
    quote_char   => '"', 
    escape_char   => '@', 
    binary    => 1, 
    keep_meta_info  => 0, 
    allow_loose_quotes => 1, 
    allow_whitespace => 1, 
}); 


open (CSV, "<", $file) or die $!; 

while (<CSV>) { 
    if ($csv->parse($_)) { 
     my @columns = $csv->fields(); 
     print "$columns[0]\r\n"; 
     print "$columns[1]\r\n"; 
     print "$columns[2]\r\n"; 
     print "$columns[3]\r\n"; 
     print "$columns[4]\r\n"; 
     print "$columns[5]\r\n"; 
     print "$columns[6]\r\n"; 
     print "$columns[7]\r\n"; 
    } 
    else { 
     my $err = $csv->error_input; 
     print "Failed to parse line: $err"; 
    } 
} 
close CSV; 

回答

11
foreach(@columns) 
{ 
    print "$_\r\n"; 
} 

代替所有列[數字]。

+0

謝謝。這很好用! – 2010-07-07 21:36:36

6

如果你只是想用空格隔開的元素:

print @columns; 

如果你想成爲一個有點花哨,你可以使用join

print join("\n", @columns); 

如果你需要做的更多的東西,迭代它:

foreach (@columns) { 
    # do stuff with $_ 
} 
+0

我剛剛嘗試了連接功能,它也很棒。這實際上解決了我正在處理的腳本的另一個方面。非常感謝! – 2010-07-07 21:42:35

+2

您的'join'示例在最後一項之後不打印換行符。 – mob 2010-07-07 22:29:17

+0

@mobrule:如果這是必要的,那麼添加:'print join(「\ n」,@columns),「\ n」;' – 2010-07-07 22:30:17

1

如果你這樣做是出於診斷目的(而不是演示)你可能會考慮Data :: Dumper。無論如何,這是一個很好的工具,可以知道您是否想要快速打印出更多或更少的任意數據。

+0

我會檢查出來的。謝謝! – 2010-07-07 21:50:20

8

出於調試的目的,Data::Dump是我選擇的武器。它基本上很漂亮 - 打印數據結構。

use strict; 
use warnings; 
use Data::Dump 'dump'; 

# Do some stuff.... 

dump @array;  # Unlike Data::Dumper, there's no need to backslash ('\@array') 
dump %hash;  # Same goes for hashes 
dump $arrayref; 
dump $hashref; # References handled just as well 

還有很多其他的方法可以打印陣列,當然:

say foreach @columns;   # If you have Perl 5.10+ 
print $_,"\n" foreach @columns; # If you don't 

print "@columns";    # Prints all elements, space-separated by default 

'最好' 的答案取決於具體情況。你爲什麼需要它?你在做什麼?你想要什麼?然後相應地編碼。

1
{ $"="\n"; print $fh "@files"; }