Почему $ ARGV [0] не инициализируется именем файла, который я передаю этому perl one liner? - PullRequest
9 голосов
/ 04 октября 2011

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

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

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

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

Что я пропускаю?

Ответы [ 2 ]

19 голосов
/ 04 октября 2011

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

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

(Скобки необходимы, потому что $ARGV_ является допустимым именем для переменной.)

3 голосов
/ 04 октября 2011

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...