/ / Pourquoi $ ARGV [0] n’est-il pas initialisé avec le nom du fichier par lequel je passe cette ligne perl one? - perl

Pourquoi $ ARGV [0] n'est-il pas initialisé par le nom de fichier que je transmets à cette liste? - perl

J'ai un paquebot Perl one qui est censé exporterChaque ligne individuelle dans un fichier XML se trouve dans son propre fichier séparé avec le nom du fichier d'origine, puis le numéro de la ligne dans ce fichier d'où il provient.

Par exemple, si le fichier xml s'appelle "foo.xml" et qu'il contient 100 lignes, je souhaite avoir une centaine de fichiers appelés "foo_1.xml", "foo_2.xml", "foo_3.xml", etc. .

Je pensais que le nom du fichier que je transmettrais à l'un des doublures serait disponible via ARGV, mais ce n'est pas le cas. J'obtiens une erreur "valeur non initialisée dans $ ARGV [0]" lorsque j'exécute ceci:

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

Qu'est-ce que je regarde?

Réponses:

19 pour la réponse № 1

Lorsque vous utilisez la magie <> filehandle (que vous faites implicitement avec le -n option), Perl décale les noms de fichiers de @ARGV comme il les ouvre. (Ceci est mentionné dans perlop.) Vous devez utiliser le scalaire ordinaire $ARGV, qui contient le nom du fichier en cours de lecture:

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

(Les accolades sont nécessaires car $ARGV_ est un nom légal pour une variable.)


3 pour la réponse № 2

cjm a la bonne réponse. Cependant, il créera des fichiers tels que foo.xml_1.xml. Vous avez demandé foo_1.xml, etc.

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