我正在尝试解析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 回答
你需要chomp()每行删除每行附带的换行符“\ n”:
或者,您可以通过添加's'修饰符使正则表达式成为多行,这将允许您的“ . *”使用换行符:
一些事情
永不评论
use strict;
在
die
消息之后不要包含换行符,告诉die隐藏行号和文件消息您使用%看到的电话号码是唯一的 . 因此,将它们的结果输出到文件处理循环之外 . 另外,定义%被视为外部循环的词汇或来自先前文件的电话号码仍然存在 .
如果您没有得到任何结果,那么您的正则表达式可能不匹配 . 也许主播太有限了:
^
这是你的脚本的一些清理: