2011-11-22 119 views
1

我有下面這段代碼:如何通過逗號分割一個字符串,而不包括在Perl引號內的逗號?

my $file = 'c:\test.log'; 
open (FILE, "<", $file) or die $!; 
my @list = grep /\bAdobe\b/, <FILE>; 
my $days; 
foreach (@list) { 
$days = $_; 
print "$days\n"; 
} 

預期的結果是:

"Adobe","10:10:10, 11/10/2011","Ready" 

我想要的結果用逗號與下面這段代碼分裂:

my @sample = split(',', $days); 

期望的結果是:

"Adobe" 
"10:10:10 
11/10/2011" 
"Ready" 

但它不是我想做的事:

我想打印輸出是這樣的:

"Adobe" 
"10:10:10, 11/10/2011" 
"Ready" 

我怎麼能做到這一點,而無需使用/安裝類似文本的任何模塊:: CSV。

請指教,謝謝。

回答

6

理想情況下,你可以使用一個CSV解析器,看到Text::CSV。或者只要所有的字段雙引號,那麼你可以使用一個稍微複雜一點的正則表達式的分裂,其檢查的分隔符:

split /(?<="),(?=")/, $days; 
+0

它的工作!謝謝。我需要的是消除報價。 – quinekxi

4

我相信它適用於Text::CSV模塊。 像這樣的例子應該作品:

use Text::CSV; 

my $file = 'c:\test.log'; 
open (my $FILE, "<", $file) or die $!; 
my $csv = Text::CSV->new; 

while (my $row = $csv->getline($FILE)) { 
    my @sample = @$row; 
    next if $sample[0] !~ /\bAdobe\b/; 
    # do whatever you want 
} 
+0

是的,我已經嘗試過這一點。但我限制不使用cpan中的任何模塊。 – quinekxi

+2

它不是強制性的'安裝',只需從cpan下載,解壓並將「use lib'path/to/text-csv/lib'」放在腳本的頭部。 – yko

+0

哦,我不知道那件事。指出。謝謝 – quinekxi

2

有沒有必要從CPAN安裝文字:: CSV(雖然,如果你有這個限制,那麼你真的需要得到那個固定的),因爲標準分佈的Text::ParseWords模塊也可以使用。

1

由於串"Adobe","10:10:10, 11/10/2011","Ready"是Perl代碼有效,您可以使用eval

my $file = 'c:\test.log'; 
open my $fh, "<", $file or die $!; 
for (grep /\bAdobe\b/, <FILE>) { 
    my @sample = eval; 
    # code here 
} 

但僅僅做到這一點的數據你一定是有效的格式。從Data::Dumper

輸出:

$VAR1 = [ 
      "Adobe", 
      "10:10:10, 11/10/2011", 
      "Ready" 
     ]; 
相關問題