Почему $ARGV[0] не инициализируется именем файла, который я передаю этому perl one liner?

#perl

#perl

Вопрос:

У меня есть perl one liner, который должен экспортировать каждую отдельную строку в xml-файле в свой отдельный файл с именем исходного файла, а затем номером строки в том файле, из которого он был получен.

Например, если вызывается XML-файл «foo.xml » и в нем есть 100 строк, тогда я хочу вызвать сотню файлов».foo_1.xml «, «foo_2.xml «, «foo_3.xml «и т.д.

Я думал, что имя файла, который я передаю в one liner, будет доступно через ARGV, но это не так. При запуске я получаю ошибку «неинициализированное значение в $ ARGV [0]»:

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

Что я упускаю из виду?

Комментарии:

1. Также вижу эту проблему в скрипте. Я этого не понимаю.

Ответ №1:

При использовании волшебного <> дескриптора файла (что вы делаете неявно с -n помощью опции), Perl сдвигает имена @ARGV файлов по мере их открытия. (Это упоминается в perlop .) Вам нужно использовать обычный скаляр $ARGV , который содержит имя файла, из которого в данный момент считывается:

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

(Фигурные скобки необходимы, потому $ARGV_ что это законное имя переменной.)

Комментарии:

1. Работает для меня. У меня есть каталог, полный файлов с отдельными строками! В будущем я буду более осторожен…

2. @sehe, ты передал ему имя существующего файла с содержимым? Perl будет выполняться print $ARGV для каждой прочитанной строки. Если он не прочитает ни одной строки, он ничего не напечатает.

3. Спасибо, я забыл об этом.

4. Спасибо за подсказки. Мне не очень нравится такое поведение, но, думаю, я понимаю, как perl будет «игнорировать» пустой файл, который я действительно создал. 1

Ответ №2:

у cjm есть правильный ответ. Однако он создаст такие файлы, как foo.xml_1.xml . Вы просили foo_1.xml и т. Д.

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

Комментарии:

1. Хороший момент. Я пропустил эту часть его требований, главным образом потому, что у его исходного кода была бы та же проблема, если бы она работала. Его главной проблемой было просто найти имя файла, а не преобразовать его.