为什么不通过文件名初始化$ ARGV [0]我通过这个perl one liner?

时间:2011-10-03 22:41:48

标签: perl

我有一个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 个答案:

答案 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