2013-01-10 4 views
-3

J'essaye de reformater la date pour MySQL. Ce Perl one-liner me donne ci-dessous un message d'erreur.Perl oneliner peut être un message multi-ligne en fuite ++

Je voudrais comprendre pourquoi il donne ce message d'erreur.

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"; 

      ' 

Message d'erreur

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

La coloration syntaxique de votre article ne vous aide-t-elle pas à détecter au moins un des problèmes? Mettez tout cela dans un script, cela ne sert à rien de le faire en ligne de commande. – Mat

+0

Je l'ai utilisé dans une partie de shell scirpt, dans VIM il ne l'a pas montré – sfgroups

+0

Utiliser 10 lignes (y compris une ligne vide) pour un 'one-liner' semble être une contradiction dans les termes. En Perl, vous pouvez choisir quel (s) caractère (s) utiliser pour les guillemets simples, alors écrivez: 'split (q {\ s +}, $ _);' pour éviter d'avoir des guillemets simples dans votre script Perl. –

Répondre

1

Le problème est que vous avez essayé d'intégrer des guillemets simples dans une chaîne unique cité. Vous pouvez leur échapper, mais split va diviser $_ sur les espaces par défaut.

Voici une solution, mais comme Mat dit que c'est un programme, pas un one-liner. Mettez-le dans un fichier.

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

Dans le shell, vous ne pouvez pas éviter les guillemets simples entre guillemets. Il y a des solutions de rechange. – jordanm

+0

Merci pour l'aide, j'ai négligé seul qutoe. script converti en ligne à utiliser avec-dans le script shell. – sfgroups

+1

@jordanm '' \ '' 'être le plus infaillible que je connaisse. – hobbs

Questions connexes