2013-03-24 67 views
0

我使用Perl WWW::Mechanize包來從一些網站獲取和處理數據。通常我的行動方式如下:在寫入文件之前處理變量中的文本

  1. 取網頁

    $mech->get("$url");

  2. 保存在一個變量(BTW的,我不知道這是否是正確的方式對網頁內容保存標中的文本的這個量的,據我所知,應該是用於單個值)

    my $list = $mech->content();

  3. 使用我創建的子例程將變量的內容寫入文本文件。 (該writetoFile子程序包括一些更多的功能,如路徑和現有的文件驗證..)

    writeToFile("$filename.tmp","$path",$list);

  4. 通過建立一個附加文件的處理在先前步驟中創建的文件的文本和保存處理的內容有(然後刪除最初的臨時文件)。

我想知道什麼,是是否有可能存儲在文件中的文本之前執行的處理,直接在$list變量裏面?整個過程如預期的那樣工作,但是我並不喜歡它背後的邏輯,而且它也有點低效,因爲我必須多次重寫相同的文件。

編輯: 只是爲了給我更多的信息,當我處理變量的內容後我實際上是什麼。因此,在這種情況下,我從網站獲取的數據實際上是由空行分隔的項目列表,第一行與我無關。所以我在做什麼,而處理這個數據是兩兩件事:

  1. 取出空(CRLF)行
  2. 刪除第一行,如果它包括一個特定的文本。

理想情況下,我希望將已處理的列表(未刪除空格和第一行)保存在文件中,而不會在途中創建任何其他文件。爲了保存文件,我想用writeToFile子(我寫),因爲它也對這樣的文件是否已經存在執行驗證(如果一個文件將在最終處理前被保存 - 在writeToFile總是會改寫現有的文件)。

,真希望是有道理的。

+0

當然是。你究竟在管理什麼? – Mat 2013-03-24 11:10:08

+0

@Mat嗨。我的問題似乎是逐行讀取可變內部的文本,並根據某些條件執行處理每行文本,然後將輸出保存在某處..就像我用文件做的那樣。用I文件,我讀取每一行,檢查每一行,並將處理後的輸出寫入另一個文件。謝謝。 – 2013-03-24 11:16:23

+1

看看這裏的答案:http://stackoverflow.com/questions/1445426/how-can-i-process-a-multi-line-string-one-line-at-a-time-in-perl-with -use-strict,特別是http://stackoverflow.com/a/1445732/635608 – Mat 2013-03-24 11:19:43

回答

1

您正在尋找split。該模式取決於:使用(?<=\n)拆分爲新的一行字符並保留它。如果沒關係,請使用\R來包含各種換行符。

foreach my $line (split qr/\R/, $mech->content) { 
    … 
} 

現在強制性的HTML的解析,用正則表達式警告:如果你的HTML源與機械化,解析它行由行並沒有太大的意義。您可能想要處理HTML文檔的text版本,或者將HTML源代碼傳遞給解析器(例如Web::Query)以聲明式地獲取所需的部分。

+0

謝謝你的回答。我能夠將您的建議併入我的代碼。但是,請你解釋一下這個'qr/\ R /'模式。你提到'\ R'是換行的模式,但是'qr'怎麼辦?謝謝 – 2013-03-28 16:26:57

+1

http://p3rl.org/rebackslash#%5cR http://p3rl.org/qr http://p3rl.org/op#qr%2fSTRING%2fmsixpodual'qr'運算符生成一個模式。 「split」的第一個參數是一個模式。 – daxim 2013-03-28 20:12:00

+0

非常感謝您的鏈接和解釋! – 2013-03-28 20:13:25

相關問題