2011-10-03 17 views
9

Tengo un trazador de líneas Perl que supuestamente exporta cada línea individual en un archivo xml a su propio archivo separado con el nombre del archivo original y luego el número de línea dentro de ese archivo del que proviene.

Por ejemplo, si el archivo xml se llama "foo.xml" y tiene 100 líneas, quiero tener cientos de archivos llamados "foo_1.xml", "foo_2.xml", "foo_3". xml ", etc.

Pensé que el nombre del archivo que paso al delineador estaría disponible a través de ARGV, pero no es así. Me estoy poniendo un "valor no inicializado en $ argv [0]" error al ejecutar esto:

perl -nwe 'open (my $FH, ">", "$ARGV[0]_$.\.xml"); print $FH $_;close $FH;' foo.xml 

Lo estoy pasando por alto?

Respuesta

19

Al utilizar el identificador de archivo magic <> (que está haciendo implícitamente con la opción -n), Perl cambia los nombres de archivo de @ARGV cuando los abre. (Esto se menciona en perlop.) Es necesario utilizar el escalar llanura $ARGV, que contiene el nombre del archivo que actualmente se leen de: (. Los apoyos son necesarios porque $ARGV_ es un nombre válido para una variable)

perl -nwe 'open (my $FH, ">", "${ARGV}_$.\.xml"); print $FH $_;close $FH;' foo.xml 

+0

-1 confirmado que no funciona: 'perl -nwe 'print $ ARGV' foo.xml ' – sehe

+2

@sehe: Funciona para mí si existe 'foo.xml' y no está vacío. – yibe

+2

Funciona para mí. ¡Obtuve un directorio lleno de archivos con líneas individuales! Tendré más cuidado en el futuro ... –

3

cjm tiene la respuesta correcta. Sin embargo, creará archivos como foo.xml_1.xml. Usted pidió foo_1.xml, etc.

perl -nwe ' 
my ($file) = $ARGV =~ /(\w+)/; 
open my $fh, ">", $file . "_$..xml" or die $!; 
print $fh $_; 
' foo.xml 
+1

Buen punto. Pasé por alto esa parte de sus requisitos, principalmente porque su código original habría tenido el mismo problema, si hubiera funcionado. Su problema principal era encontrar el nombre del archivo, no transformarlo. – cjm

Cuestiones relacionadas