2011-10-13 12 views
12

estoy tratando de ejecutar el siguiente en Windows con 5.14.2¿Por qué me aparece "No encuentro el terminador de cadena" '"en cualquier lugar antes de EOF en -e línea 1" cuando intento ejecutar Perl one-liner en Windows?

C:\Perl>perl -e 'print "Hello World \n"' 
Can't find string terminator "'" anywhere before EOF at -e line 1.

¿Qué me falta?

+0

si está utilizando Perl 5.10+, utilice el' -E' opción en lugar de '-e', que enciende las nuevas características, entre ellas' say' que es 'print' pero con una nueva línea implícita al final.' perl -E "say 'hello world'" ' –

+0

No lo hace t work @ Eric. No en este caso. Porque el problema aquí son las comillas que deben revertirse. (Me pregunto si te funciona ...) – Apostolos

Respuesta

25

Falta un caparazón decente con reglas de cita bien definidas y sanas. En Windows, solo la comilla doble se considera una cita, y las reglas de escape están mal definidas e inconsistentes. Trato:

perl -e "print qq{Hello World \n}" 

recomiendo encarecidamente evitar cualquier cosa menos las más sencillas de una sola línea en Windows. (Otro problema con Windows one-liners es que el shell de Windows no expande comodines. Si usa *.txt en la línea de comandos, buscará un archivo llamado literalmente *.txt. Lo encontrará más tarde)

en Windows, lo que ha escrito es equivalente a:

perl -e "'print" "Hello World \n'" 

es decir, el código Perl intento de ejecución es 'print con @ARGV que contiene la única cadena Hello World \n'. (No es una nueva línea, es una barra invertida seguida de n).

+3

En realidad, creo que estás exagerando. Nunca me sentí demasiado tullido. escribiendo líneas simples en Windows. – TLP

+1

En Windows, es el trabajo de la aplicación (no el trabajo del shell) para analizar la línea de comando. El problema de los PO me parece como si representara un error en el lanzamiento de Windows de Perl. –

+0

@HarryJohnston, en realidad son ambas cosas. Primero, el shell analiza la línea de comando (buscando tuberías, redirección, etc.). Luego, la aplicación analiza la línea de comando. (Por lo general, en realidad es la biblioteca de tiempo de ejecución de C/C++ de la aplicación la que lo analiza). Es por eso que la línea de comandos de Windows es un desastre; las reglas de análisis no están bien definidas, y diferentes bibliotecas C analizan las cosas de forma ligeramente diferente. – cjm

4

En Windows, las comillas deben revertirse. Así, en lugar de:

C:\Perl>perl -e 'print "Hello World \n"' 

que debe ser:

C:\Perl>perl -e "print 'Hello World \n'" 

(atribución Learning Perl, 6ª edición, pág 295).

+1

Esto imprime "Hello World \ n", \ n se imprimió como está y no como nueva línea. – rodee

2

También encontré que esto funcione. Estoy utilizando Windows 7 usando c:\Windows\system32\cmd.exe

perl -e "$a=2; print(\"$a \n \");" 

estoy usando la barra de escape en mi declaración de impresión para obtener las cotizaciones a aparecer \"

Cuestiones relacionadas