J'écris ce script Perl qui obtient deux arguments de ligne de commande: un répertoire et un an. Dans ce répertoire, il y a une tonne de fichiers texte ou de fichiers html (selon l'année). Disons par exemple que c'est l'année 2010 qui contient des fichiers qui ressemblent à ceci: <number>rank.html
avec le nombre allant de 2001 à 2212. Je veux qu'il ouvre chaque fichier individuellement et prenne une partie du titre dans le fichier html et l'imprime dans un texte fichier. Cependant, lorsque j'exécute mon code, il imprime simplement le premier titre de fichier dans le fichier texte. Il semble qu'il ouvre seulement le premier fichier 2001rank.html et pas d'autres. Je vais poster le code ci-dessous et merci à tous ceux qui aident.Pourquoi mon script Perl continue de lire le même fichier, même si je l'ai fermé?
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;
En d'autres termes $column_name
obtient égal à la même chose chaque passage dans la boucle, même si je sais que les fichiers html sont différents.
Utilisez des handles de fichiers lexicaux. Pourquoi vérifiez-vous le succès de 'open' en utilisant' fileno'? –
Comment devrais-je vérifier le succès? – adhanlon
Vérifiez le succès avec le résultat de l'appel ouvert, mais vous devriez vraiment lire le doc en premier: http://perldoc.perl.org/functions/open.html Toujours! :) – sebthebert