#perl
#perl
Вопрос:
Я написал эту маленькую программу, чтобы сопоставить шаблон и заменить его:
#!/usr/bin/perl
$LOGFILE = "odds.dat";
open(LOGFILE) or die("Could not open log file.");
foreach $line (<LOGFILE>) {
($hour, $match, $odd1, $oddx, $odd2, $dummy) = split(/,/,$line);
($hteam,$ateam) = split(/ § /,$match);
$hteam=get_name($hteam);
$ateam=get_name($ateam);
$match="$hteam - $ateam";
$foo=qq("$hour" "$match" $odd1 $oddx $odd2 n) ;
print $foo;
}
sub get_name {
# Return the full name for the team, if it exists, otherwise return the original
my %alias = (
"Atletico-MG" => "Atletico Mineiro",
"Atletico-PR" => "Atletico Paranaense",
...
...
"U.A.N.L.- Tigres" => "U.A.N.L.",
...
...
);
return $alias{$_[0]} // $_[0];
}
где коэффициенты.dat — это:
2011-10-28 20:00 , Atletico-MG § Atletico-PR ,2.00 ,5.00, 6.00
2011-10-28 20:00 ,U.A.N.L.- Tigres § Atletico-MG ,2.00,5.00,6.00
но результат:
"2011-10-28 21:15 " " Atletico-MG - Atletico-PR " 2.00 5.00 6.00
"2011-10-28" "U.A.N.L. - Atletico-MG " 2.00 5.00 6.00
почему Atletico-MG и Atletico-PR не распознаются?
Ответ №1:
Добавьте следующую строку отладки в начало вашей get_name
функции.
warn "In get_name looking for <$_[0]>n";
Я думаю, это прояснит, в чем проблема.
Ответ №2:
У вас есть пробелы в именах ваших команд, например " Atletico-MG"
, не совпадает "Atletico-MG"
. Это можно устранить при первом разделении. Вам также не нужно экранировать запятую:
split(/s*,s*/,$line);
Разработка:
Вы не используете строгие и предупреждения, что является плохой идеей. Рекомендуется использовать open с тремя аргументами и лексический дескриптор файла, и я бы рекомендовал использовать $!
в вашем сообщении die, чтобы вы знали, почему это не удается. Я также изменил ваше другое разделение, чтобы убрать пробелы и ограничить двумя полями (поскольку никогда не бывает больше двух команд).
Вам не нужна $dummy
переменная, если вы не собираетесь ее использовать, так как дополнительные значения из разделения будут отброшены. Однако вам нужно будет настроить перевод строк, иначе иногда вы получите два. Я добавил chomp
.
Я предполагаю, что ваши двойные кавычки вокруг названий времени и команд являются преднамеренными. Вы можете рассмотреть возможность печати с использованием разделителей табуляции. Он довольно удобочитаем, а также упрощает разделение при дальнейшей обработке. Например.:
print join "t", $hour, $match, $odd1, $oddx, $odd2 . "n";
Код:
use strict;
use warnings;
my $logfile = "odds.dat";
open my $log, '<', $logfile or die "Could not open log file: $!";
foreach my $line (<$log>) {
chomp $line;
my ($hour, $match, $odd1, $oddx, $odd2) =
split /s*,s*/, $line;
my ($hteam,$ateam) = split /s*§s*/, $match, 2;
$hteam=get_name($hteam);
$ateam=get_name($ateam);
$match = "$hteam - $ateam";
print qq("$hour" "$match" $odd1 $oddx $odd2n);
}
sub get_name {
# Return the full name for the team, if it exists,
# otherwise return the original
my %alias = (
"Atletico-MG" => "Atletico Mineiro",
"Atletico-PR" => "Atletico Paranaense",
"U.A.N.L.- Tigres" => "U.A.N.L.",
);
return $alias{$_[0]} // $_[0];
}