#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. Хороший момент. Я пропустил эту часть его требований, главным образом потому, что у его исходного кода была бы та же проблема, если бы она работала. Его главной проблемой было просто найти имя файла, а не преобразовать его.