2016-10-12 85 views
2

我想在Perl中創建一個腳本來替換給定目錄中所有HTML文件中的文本。但是,它不起作用。任何人都可以解釋我做錯了什麼?Perl腳本查找和替換不工作?

my @files = glob "ACM_CCS/*.html"; 

foreach my $file (@files) 
{ 
    open(FILE, $file) || die "File not found"; 
    my @lines = <FILE>; 
    close(FILE); 

    my @newlines; 
    foreach(@lines) { 
     $_ =~ s/Authors Here/Authors introduced this subject for the first time in this paper./g; 
     #$_ =~ s/Authors Elsewhere/Authors introduced this subject in a previous paper./g; 
     #$_ =~ s/D4-/D4: Is the supporting evidence described or cited?/g; 
     push(@newlines,$_); 
    } 

    open(FILE, $file) || die "File not found"; 
    print FILE @newlines; 
    close(FILE); 
} 

例如,我要用來替換「D4-」「D4:是的......」,等等。謝謝,我會很感激的任何提示。

+3

總是'嚴格使用;'和'使用警告'全部';'!啓用警告會給你一個很好的提示。 – ThisSuitIsBlackNot

+0

謝謝。讓我看看我得到了什麼反饋。 –

+1

如果您有新問題,請發佈新問題。在人們發佈答案後,如果您完全改變了您的問題,這會變得非常混亂。 – ThisSuitIsBlackNot

回答

3

您正在使用open的兩個參數版本。如果$file未以「<」,「>」或「>>」開頭,則它將以讀取文件句柄的形式打開。您無法寫入讀取文件句柄。爲了解決這個問題,採用開放三個參數版本:

open my $in, "<", $file or die "could not open $file: $!"; 
open my $out, ">", $file or die "could not open $file: $!"; 

還要注意使用詞法文件句柄($in),而不是裸字的文件句柄(FILE)的。詞法文件句柄有過裸字的文件句柄很多好處:

  1. 它們都是局部的,而不是全球
  2. 他們關閉時,他們走出去的範圍,而不是在程序
  3. 他們更容易傳遞到結束函數(即你不必使用typeglob引用)。

您可以像使用裸句文件句柄一樣使用它們。

你可能想其他的事情要考慮:

  1. 使用嚴格編譯
  2. 使用warnings用法上的文件在時間線或塊
  3. 工作,而不是在一次讀取它們在所有
  4. 使用HTML解析器代替正則表達式,而不是
  5. 使用命名變量的默認變量($_
  6. 如果您使用的是默認的變量,不包括它在那裏已經將要使用(的s/foo/bar/;代替$_ =~ s/foo/bar/;如)

4號可能是你正在做的事情非常重要。如果你不確定這些HTML文件的格式,那麼你很容易錯過。例如,"Authors Here""Authors\nHere"對HTML意味着同樣的事情,但是你的正則表達式會錯過後面的。你可能想看看XML::Twig(我知道它說XML,但它也處理HTML)。這是一個非常容易使用的XML/HTML解析器。