2011-10-03 15 views
9

我有一個perl應用程序,它應該將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 

我是什麼俯瞰?

回答

19

當使用魔術<>文件句柄(您正在暗中使用-n選項)時,Perl在打開它們時將文件名從@ARGV中移出。 (這是在perlop提及。)您需要使用普通的標量$ARGV,其中包含目前正在讀取的文件名:(大括號是必要的,因爲$ARGV_是一個可變的合法名稱)

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

+0

-1證實不工作:'perl的-nwe '打印$ ARGV' foo.xml ' – sehe

+2

@sehe:這對我的作品如果'foo.xml'存在,不是空的。 – yibe

+2

適合我。我有一個目錄充滿個別行的文件!我將來會更加小心...... –

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 
+1

好點。我忽略了他的那部分要求,主要是因爲他的原始代碼會有同樣的問題,如果它有效的話。他的主要問題是找到文件名,而不是改變它。 – cjm

相關問題