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

phi*_*ogg 9 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
Run Code Online (Sandbox Code Playgroud)

我在俯瞰什么?

cjm*_*cjm 19

当使用魔术<>文件句柄(您正在使用该-n选项隐式执行)时,Perl会在@ARGV打开文件名时将文件名移出.(这在perlop中提到.)你需要使用普通标量$ARGV,它包含当前正在读取的文件名:

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

(大括号是必要的,因为它$ARGV_是变量的合法名称.)

  • @sehe:如果`foo.xml`存在且不为空,它对我有用. (2认同)
  • 适合我.我有一个包含单独行的文件目录!我将来会更加小心...... (2认同)