【发布时间】:2011-01-07 11:01:02
【问题描述】:
我正在编写这个 Perl 脚本,它有两个命令行参数:一个目录和一个年份。在这个目录中有大量的文本文件或 html 文件(取决于年份)。假设它是 2010 年,其中包含看起来像 <number>rank.html 的文件,编号从 2001 到 2212。我希望它单独打开每个文件并在 html 文件中获取部分标题并将其打印到一个文本文件。但是,当我运行我的代码时,它只会将第一个文件标题打印到文本文件中。它似乎只打开第一个文件 2001rank.html 而没有其他文件。我将在下面发布代码,并感谢任何提供帮助的人。
my $directory = shift or "Must supply directory\n";
my $year = shift or "Must supply year\n";
unless (-d $directory) {
die "Error: Directory must be a directory\n";
}
unless ($directory =~ m/\/$/) {
$directory = "$directory/";
}
open COLUMNS, "> columns$year.txt" or die "Can't open columns file";
my $column_name;
for (my $i = 2001; $i <= 2212; $i++) {
if ($year >= 2009) {
my $html_file = $directory.$i."rank.html";
open FILE, $html_file;
#check if opened correctly, if not, skip it
unless (defined fileno(FILE)) {
print "skipping $html_file\n";
next;
}
$/ = "\n";
my $line = <FILE>;
if (defined $line) {
$column_name = "";
$_ = <FILE> until m{</title>};
$_ =~ m{<title>CIA - The World Factbook -- Country Comparison :: (.+)</title>}i;
$column_name = $1;
}
else {
close FILE;
next;
}
close FILE;
}
else {
my $text_file = $directory.$i."rank.txt";
open FILE, $text_file;
unless (defined fileno(FILE)) {
print "skipping $text_file\n";
next;
}
$/ = "\r";
my $line = <FILE>;
if (defined $line) {
$column_name = "";
$_ = <FILE> until /Rank/i;
$_ =~ /Rank(\s+)Country(\s+)(.+)(\s+)Date/i;
$column_name = $3;
}
else {
close FILE;
next;
}
close FILE;
}
print "Adding $column_name to text file\n";
print COLUMNS "$column_name\n";
}
close COLUMNS;
换句话说,$column_name 在循环中的每次传递都被设置为相同的值,即使我知道 html 文件不同。
【问题讨论】:
-
使用词法文件句柄。为什么要使用
fileno来检查open是否成功? -
我应该如何检查成功?
-
使用 open 调用的结果检查成功,但您应该首先阅读文档:perldoc.perl.org/functions/open.html 始终! :)