ошибка в распознавании образов и сопоставлении строк в программе perl

#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];
}