2013-01-10 53 views
-3

我想重新格式化MySQL的日期。這個Perl單線程給了我下面的錯誤信息。Perl oneliner可能是一個失控的多行++消息

我想知道爲什麼它給出這個錯誤信息。

echo 'Dec 2 04:08:40 EST 2012' | perl -lane ' my @abbr = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); 
       ($amon, $mday, $hour,$tz, $year) =split('\s+',$_); 
       for (my $i = 0; $i < @abbr; $i++) { 
       next unless $abbr[$i] =~ /^$amon/; 
       $mon=$i; 
       } 
       $mon++; 
       print "$year-$mon-$mday $hour"; 

      ' 

錯誤消息

syntax error at -e line 3, near ") {" 
    (Might be a runaway multi-line ++ string starting on line 2) 
syntax error at -e line 9, near ";}" 
Execution of -e aborted due to compilation errors. 
+6

在您的文章中突出顯示的語法是否可以幫助您發現至少一個問題?把所有這些放在一個腳本中,在命令行上試圖做到這一點是毫無意義的。 – Mat

+0

我在VIM中使用了這個部分,它沒有顯示它 – sfgroups

+0

對於'單行'使用10行(包括空白行)看起來似乎是一個矛盾。在Perl中,您可以選擇使用哪些字符作爲'單引號',因此請編寫:split(q {\ s +},$ _);'以避免在Perl腳本中使用單引號。 –

回答

1

的問題是,你已經嘗試將單引號字符串中嵌入單引號。你可以逃避它們,但split默認情況下會在空白處分割$_

這是一個解決方案,但正如馬特所說,這是一個程序,而不是一個班輪。把它放在一個文件中。

echo 'Dec 2 04:08:40 EST 2012' | perl -lane ' 
@abbr = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); 
($amon, $mday, $hour, $tz, $year) = split; 
for my $i (0..$#abbr) { 
    next unless $abbr[$i] =~ /^$amon/; 
    $mon=$i; 
} 
$mon++; 
print "$year-$mon-$mday $hour";' 
+0

在shell中,您技術上無法在單引號內跳過單引號。有解決方法。 – jordanm

+0

感謝您的幫助,我忽略了單一的qutoe。將腳本轉換爲聯機以在shell腳本中使用。 – sfgroups

+1

@jordanm''''''是我知道的最簡單的方法。 – hobbs