2011-10-03 11 views
9

Ho un rivestimento perl che dovrebbe esportare ogni singola riga in un file xml nel proprio file separato con il nome del file originale e quindi il numero di riga all'interno del file da cui proviene.

Ad esempio, se il file xml è chiamato "foo.xml" e contiene 100 righe, desidero avere un centinaio di file chiamati "foo_1.xml", "foo_2.xml", "foo_3. xml ", ecc.

Ho pensato che il nome del file che ho passato a quello di linea sarebbe disponibile tramite ARGV, ma non lo è. Sto diventando un "valore non inizializzato in $ ARGV [0]" quando faccio funzionare questo:

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

cosa sto trascurando?

risposta

19

Quando si utilizza il magic file handle <> (che si sta facendo implicitamente con l'opzione -n), Perl sposta i nomi dei file da @ARGV durante l'apertura. (Questo è menzionato nel perlop.) È necessario utilizzare lo scalare pianura $ARGV, che contiene il nome del file in fase di lettura da: (. Le parentesi sono necessarie perché $ARGV_ è un nome legale per una variabile)

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

+0

-1 confermato di non lavorare: 'perl -nwe 'print $ ARGV' foo.xml ' – sehe

+2

@sehe: Funziona per me se 'foo.xml' esiste e non è vuoto. – yibe

+2

Funziona per me. Ho una directory piena di file con linee individuali! Sarò più attento in futuro ... –

3

cjm ha la risposta corretta. Tuttavia, creerà file come foo.xml_1.xml. Avete chiesto foo_1.xml, ecc

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

Buon punto. Ho trascurato quella parte delle sue richieste, principalmente perché il suo codice originale avrebbe avuto lo stesso problema, se avesse funzionato. Il suo problema principale era trovare il nome del file, non trasformarlo. – cjm

Problemi correlati