2012-04-25 60 views
1

我有一個大約800個html文件的目錄。我正在嘗試搜索每個文件並在標籤之間返回文本。然後,我想創建一個包含該文本的目錄,並在其中移動(或複製)文件。當我想到這件事時,這似乎是一個相當簡單的努力,但我也遇到了很多問題,甚至找出了我需要的模塊。我已經看過File :: Find和glob,但我不完全確定如何在文件中使用正則表達式來實現txt(而不是文件名)。我基本上是perl的新手,所以任何和所有的幫助都會不勝感激。提前致謝。搜索,創建並在Perl中移動

編輯 爲了澄清:我試圖做到:

讀取目錄=〜/我/項目/

對於〜/我/項目/找到的所有文件=〜/.html$/I

對於每個文件,搜索= DIV類= 「RECIP」 ID = 「objectTo」>的HTML(。*)/格

對於每一個(。*)IE [email protected]或John Doe創建一個同名的目錄

將每個具有[email protected]或John Doe實例的文件循環移回到其相應的目錄。

我真的很感謝幫助!

+0

代碼應該如何確定移動或複製文件的名稱? – 2012-04-25 19:10:31

+0

通過標量。我最初的想法是,我可以寫一個正則表達式,如$ html =〜m {(*。*) rar 2012-04-25 20:27:12

+0

請編輯您的問題,以提供*簡要*的例子,您可以使用這些HTML來確定移動或複製的文件名。代碼應該如何去除「From」值?請記住,我們完全不瞭解您的問題,並需要特定的信息爲您提供有用的建議。 – 2012-04-25 20:32:00

回答

2

你在File :: Find的正確軌道上。

您將創建'wanted()'函數,在該函數中,找到的文件的名稱將爲$File::Find::name。然後,您可以使用它來打開文件句柄,讀入文件,搜索標籤並提取要查找的數據,然後關閉文件句柄。 File :: Find將轉到下一個文件。

#! /usr/bin/perl 

use warnings; 
use strict; 
use File::Find; 

sub wanted { 
    my $file=$File::Find::name; 

    # if the file has the extension '.html' (case insensitive) ... 
    if($file =~ /\.html$/i) { 
     my $FH; 
     open($FH, '<', $file) or die "Could not open '$file' for reading: $!"; 
     local $/ = ''; 
     my $contents = <$FH>; # slurp file into $contents 
     # search $contents for the tags that you're looking for, 
     # 
     close $FH; 
    } 
} 

my @directories = (
     './htmlfiles' 
    , './www' 
    , './web' 
); 

find(\&wanted, @directories); 

警告:代碼通過perl -c,但我沒有運行它。

0

對於問題的第二部分,請查看HTML::Strip以從文本中剝離HTML標記。

+0

[HTML :: Restrict](https://metacpan.org/module/HTML::Restrict)也可用於刪除標記。 – oalders 2012-04-25 20:19:29

+0

誰說什麼剝離?附加到問題的註釋讀起來像[rar](http://stackoverflow.com/users/1316130/rar),而不是想要在DOM中的某個地方選擇性地抓取一些文本,[Web :: Query]( http://p3rl.org/Web::Query)和[HTML :: TreeBuilder :: XPath](http://p3rl.org/HTML::TreeBuilder::XPath)是合適的。一旦加價消失,這是相當困難的。 – daxim 2012-04-25 22:07:28

+0

感謝澄清daxim。這是完全正確的。我希望html文件完好無損,並且不要以爲我需要刪除標記,只要我的正則表達式符合我的要求即可。我正在使用這些標籤來標識我想用作將要創建的目錄名稱的文本。 – rar 2012-04-25 22:49:18