我有一个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
我在俯瞰什么?
答案 0 :(得分:19)
使用魔术<>
文件句柄(您使用-n
选项隐式执行)时,Perl会在打开文件名时将文件名移出@ARGV
。 (perlop中提到了这一点。)您需要使用普通标量$ARGV
,其中包含当前正在读取的文件名:
perl -nwe 'open (my $FH, ">", "${ARGV}_$.\.xml"); print $FH $_;close $FH;' foo.xml
(大括号是必要的,因为$ARGV_
是变量的合法名称。)
答案 1 :(得分:3)
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