【问题标题】:Search, Create and Move in Perl在 Perl 中搜索、创建和移动
【发布时间】:2012-05-06 10:13:23
【问题描述】:

我有一个包含大约 800 个 html 文件的目录。我正在尝试搜索每个文件并返回标签之间的文本。然后我想用该文本创建一个目录并在那里移动(或复制)文件。当我想到这一点时,这似乎是一项非常容易的尝试,但即使确定我需要的模块,我也遇到了很多问题。我已经查看了 File::Find 和 glob,但我不确定如何在文件中使用 txt 的正则表达式(而不是文件名)来实现这一点。我基本上是 perl 的新手,所以任何和所有的帮助都会受到赞赏。提前致谢。

编辑 澄清一下:我要完成的工作:

读取目录 = ~/me/project/

对于 ~/me/project/ 找到所有文件 =~ /.html$/i

对于每个文件,在 html 中搜索 = div class="recip" id="objectTo">(.*) /div

为每个 (.*) IE john@doewww.com 或 John Doe 创建一个具有相同名称的目录

循环并移动每个具有 xxxxxxxx@xxxxx.com 或 John Doe 实例的文件到其对应的目录。

非常感谢您的帮助!

【问题讨论】:

  • 代码应该如何确定移动或复制文件的名称?
  • 通过标量。我最初的想法是我可以写一个正则表达式,比如 $html =~ m{(.*)} 。匹配会返回一段文本,类似于“From John Doe”。然后将创建一个名为“From John Doe”的文件夹。然后,与该 From 行匹配的所有文件都将移到那里。所以也许它实际上是一个数组?我有 800 个文件,其中包含大约 180 个独特的“发件人”值,我正在尝试捕获它们。
  • 请编辑您的问题,以提供您希望用于确定移动或复制文件名的 HTML 的简要示例。代码应该如何找出“From”值?请记住,我们完全不熟悉您的问题,需要具体信息才能为您提供有用的建议。

标签: regex perl html-parsing


【解决方案1】:

使用 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,但我还没有运行。

【讨论】:

    【解决方案2】:

    对于您问题的第二部分,请查看 HTML::Strip 以从文本中剥离 HTML 标记。

    【讨论】:

    • HTML::Restrict 也可用于删除标记。
    • 谁说过脱衣?附加到该问题的评论类似于rar 宁愿有选择地在DOM 中的某个位置抓取一些文本,Web::QueryHTML::TreeBuilder::XPath 是适合的。一旦标记消失,这将相当困难。
    • 感谢您澄清 daxim。这是完全正确的。我希望 html 文件完好无损,只要我的正则表达式与我匹配的内容一致,我就不需要删除标记。我正在使用标签来识别我想用作将要创建的目录名称的文本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2014-10-05
    相关资源
    最近更新 更多