2012-02-10 121 views
3

我想就地編輯一堆使用Perl就地編輯運算符$^I的文本文件。我通過目錄使用金剛石(<>)運算符這樣的穿越:使用Perl的鑽石和就地編輯運算符就地編輯目錄中的多個文件

$^I = ".bak"; 

@ARGV = <*.txt>; 

while (<>) 
{ 
    s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g; 
    print; 
} 

這工作完全並執行我需要做的工作。但是如果我的@ARGV已經填充了我需要的一些其他數據呢?我試圖做到以下幾點:

$^I = ".bak"; 

my @files = <*.txt>; 

while (<@files>) 
{ 
    s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g; 
    print; 
} 

但它不起作用。我在這裏錯過了什麼?我不能使用我的$ ARGV,因爲它包含其他數據,不能將它與文件匹配模式混淆。

有什麼建議嗎?

謝謝!

回答

4

您可以事先複製您的參數,然後使用@ARGV。例如: -

my @args = @ARGV; 
@ARGV = <*.txt>; 

既然有一些隱藏的處理事情,這是具體的使用@ARGV和鑽石操作<>,你不能只用另一個數組做同樣的事情。

+0

其實我想過這個辦法了。但我認爲我在使用鑽石操作員的方式犯了錯誤。出於好奇,有沒有辦法做到這一點,而不是首先創建ARGV副本? – 2012-02-10 17:44:27

+0

@GolamKawsar當然。但並不容易。您可以簡單地寫出完整地進行就地編輯的代碼。不過,我不確定這會是什麼目的。 – TLP 2012-02-10 17:49:28

+1

@GolamKawsar未修改的'while(<>)'的行爲綁定到所謂的「魔術'ARGV'」文件句柄上,該文件句柄(不出所料,基於它的名字)與'@ ARGV'數組相連。如果你想要那個,你需要使用另一個。正如@TLP所說,另一種選擇是,根本不使用magic-'ARGV'或'$^I'並自己編寫相應的代碼。 – hobbs 2012-02-10 18:25:53

4

你可以給@ARGV臨時值與local關鍵字:

{ 
    local @ARGV = <*.txt>; 
    while (<>) {...} 
} # @ARGV gets the old value back 
+0

但是,然後在解析文件時無法訪問參數。 – TLP 2012-02-10 17:50:24

+0

@TLP:那是真的。幸運的是,在這種情況下,我不需要while塊中的參數! 我認爲這是一個整潔的方法! – 2012-02-10 17:52:42

+0

@GolamKawsar實際上和我的方法一樣,只是使用'local'來創建'@ ARGV'的副本,而不是'my'。 – TLP 2012-02-10 17:56:06

2

你不能只儲存從@ARGV,你仍然需要到另一個變量中的信息?

$^I = ".bak"; 

my @options = @ARGV; 
@ARGV = <*.txt>; 

while (<>) 
{ 
    s/((?:^|\s)-?)(0+)(?=\s|$)/$1.$2/g; 
    print; 
} 
0

我給這通常的辦法是處理參數和保存文件從一個臨時列表,然後他們的東西回到@ARGV。

my @files; 
foreach (@ARGV) { 
    ... do something with each parm 
    else { 
     push @files,$_; 
    } 
} 
@[email protected]; 
while (<>) { 
    ... 

通常,在foreach(@ARGV)我會做這樣的事情

if (-f) { 
    push @files,$_; 
    next; 
}