首页 文章

尝试解析字符串的文本文件并打印值

提问于
浏览
0

我正在尝试解析40个文本文件,这些文件位于单词“Phone:”的目录中,并打印字符串后面的电话号码 . 我是一个超级perl新手,所以任何帮助都非常感谢 . 我不得不评论严格或不会运行,

这是我的代码:

#!/usr/bin/perl
#use strict;
use warnings;

my $DIR = "/Ask";
opendir $DIR, '.' or die "opendir .: $!\n";
my @files = grep /\.txt$/i, readdir $DIR;
closedir $DIR;

print "Got ", scalar @files, " files\n";

my %seen = ();
foreach my $file (@files) {
    open my $FILE, '<', $file or die "$file: $!\n";
    while (<$FILE>) {
        #print "test\n";
        if (/^phone\s*(.*)\r?$/i) {
            $seen{$1} = 1;
            foreach my $addr ( sort keys %seen ) {
                print "$addr\n";
            }
        }
    }
    close $FILE;
}

它看到文件,但似乎永远不会匹配参数并打印结果 . 我也可以轻松地将文件转换为html并以这种方式解析它们 .

感谢目前为止提供的所有帮助 . 以下是一些问题,以及我正在解析的文件示例:

这是我正在解析的短文件的一个例子 - 安捷伦科技公司 . 总部 . 免费电话:1 877-424-4536,电话:4083458886 . 传真:1 408-345-8474地址:5301 Stevens Creek Blvd - 我认为我遇到的问题是电话:并不总是在一开始这条线 . 如果我修改我的文件并把它放在那里一切正常,但我认为脚本在连续中间找到它有问题 . 想法?

2 回答

  • 1

    你需要chomp()每行删除每行附带的换行符“\ n”:

    while (<$FILE>) {
        chomp;
        if (/^phone\s*(.*)\r?$/i) {
            $seen{$1} = 1;
            foreach my $addr ( sort keys %seen ) {
                print "$addr\n";
            }
        }
    }
    

    或者,您可以通过添加's'修饰符使正则表达式成为多行,这将允许您的“ . *”使用换行符:

    while (<$FILE>) {
        if (/^phone\s*(.*)\r?$/is) {
            $seen{$1} = 1;
            foreach my $addr ( sort keys %seen ) {
                print "$addr\n";
            }
        }
    }
    
  • 0

    一些事情

    • 永不评论 use strict;

    • die 消息之后不要包含换行符,告诉die隐藏行号和文件消息

    • 您使用%看到的电话号码是唯一的 . 因此,将它们的结果输出到文件处理循环之外 . 另外,定义%被视为外部循环的词汇或来自先前文件的电话号码仍然存在 .

    • 如果您没有得到任何结果,那么您的正则表达式可能不匹配 . 也许主播太有限了: ^

    这是你的脚本的一些清理:

    #!/usr/bin/perl
    use strict;
    use warnings;
    use autodie;
    
    my $DIR = "/Ask";
    
    my @files = do {
        opendir my $dh, '.' or die "opendir .: $!";
        grep /\.txt$/i, readdir $dh;
    };
    
    print "Got ", scalar @files, " files\n";
    
    foreach my $file (@files) {
        open my $fh, '<', $file or die "$file: $!";
    
        my %seen;
    
        while (<$fh>) {
            if (/^phone\s*(.*)$/i) {
                $seen{$1} = 1;
            }
        }
    
        foreach my $addr ( sort keys %seen ) {
            print "$addr\n";
        }
    
        close $fh;
    }
    

相关问题