2015-05-02 2 views
-1

Предполагая, что следующий вход:Perl Вывод из ошибок файла

 for ($k = 0; $k < @tableb; $k++) { 
     chomp ($tableb[$k]); 
     ($netsta, $delay_time) = (split /\s+/,$tableb[$k])[1,9]; 
     ($net, $sta) = (split /\./, $netsta)[0,1]; 
     print $net, " ", $sta, "\n"; 
     if ($net eq "ZJ" && $sta eq "DONT") { 
       $stat = 1; 
      } elsif ($net eq "ZJ" && $sta eq "MICH") { 
       $stat = 2; 
      } elsif ($net eq "ZJ" && $sta eq "LEON") { 
       $stat = 3; 
      } elsif ($net eq "ZJ" && $sta eq "RAPH") { 
       $stat = 4; 
      } elsif ($net eq "ZJ" && $sta eq "SPLN") { 
       $stat = 5; 
      } elsif ($net eq "ZJ" && $sta eq "SHRD") { 
       $stat = 6; 
      } elsif ($net eq "ZJ" && $sta eq "CASY") { 
       $stat = 7; 
      } elsif ($net eq "ZJ" && $sta eq "APRL") { 
       $stat = 8; 
      } elsif ($net eq "ZJ" && $sta eq "FOOT") { 
       $stat = 9; 
      } elsif ($net eq "ZJ" && $sta eq "BEBP") { 
       $stat = 10; 
      } elsif ($net eq "ZJ" && $sta eq "RKST") { 
       $stat = 11; 
      } elsif ($net eq "ZJ" && $sta eq "DUBY") { 
       $stat = 12; 
      } elsif ($net eq "ZJ" && $sta eq "SAMH") { 
       $stat = 13; 
      } elsif ($net eq "ZJ" && $sta eq "GRAW") { 
       $stat = 14; 
      } elsif ($net eq "ZJ" && $sta eq "KNYN") { 
       $stat = 15; 
      } else { 

      } 
     printf OUT "%s \n", $stat; 

    } 

Я желаю взять выходной сети (сети) и STA (станция) из одного файла (как показано ниже), а затем изменить ГНА (название станции указано в условных обозначениях if/elsif), до определенного числа (1-15). Мой вывод, хотя и не только печатает числа для станций, но также выводит 5, что, скорее всего, соответствует другим строкам, выводимым в 0 и 1. Я не хочу лишних пяток. Я просто хочу, чтобы номера станций изменились.

Входной файл, который я читаю выглядит как:

MCCC processed: unknown event at: Thu, 16 Oct 2014 12:42:09 CST 
station, mccc delay, std, cc coeff, cc std, pol , t0_times ,  delay_times 
ZJ.CASY  0.4736 0.0000 0.9844 0.0288 0 CASY.BHZ 300.6973  0.0691 
ZJ.GRAW  -0.1526 0.0000 0.9853 0.0277 0 GRAW.BHZ 300.8462 -0.7059 
ZJ.RAPH  1.1169 0.0000 0.9845 0.0287 0 RAPH.BHZ 300.6406  0.7691 
ZJ.SHRD  -2.0157 0.0000 0.9439 0.0038 0 SHRD.BHZ 301.0593 -2.7821 
ZJ.SPLN  0.5778 0.0000 0.9858 0.0243 0 SPLN.BHZ 300.6516  0.2191 
Mean_arrival_time: 300.2929 
No weighting of equations. 
Window: 2.94 Inset: 1.10 Shift: 0.25 
Variance: 0.00000 Coefficient: 0.97677 Sample rate: 40.000 
Taper: 0.37 
Phase: P   
PDE 2013 11 23 7 52 45.02 -17.117 -176.544 371.0 0.0 6.5 

и в настоящее время, то если условными должны читать эту информацию:

mccc 
ZJ CASY 
ZJ GRAW 
ZJ RAPH 
ZJ SHRD 
ZJ SPLN 
300 2929 
weighting 
2 94 
0 00000 
0 37 
P 
2013 

Наконец, конечная цель, для каждого файла в @tableb, я хотел бы напечатать вывод, который выглядит следующим образом:

$ filename 
7 
14 
4 
5 
6 
+0

Вы можете показать образец ввода и вывода? – tivn

+1

Пожалуйста, пожалуйста, включите «строгие» и «предупреждения» - это поможет вам найти проблемы и ошибки в коде. Это необязательно в вашем собственном коде, но когда вы просите других о помощи, это базовый шаг по устранению неполадок! – Sobrique

+1

Также - примеры входных данных. Мы не можем устранить ваш код, который выводит что-то неожиданное, если мы не знаем, что происходит _in_ для создания этого вывода. – Sobrique

ответ

1

Вы можете просто используйте хэш, это сделает весь скрипт более читаемым. Без ввода я могу только предположить, что у вас может быть вторая запись в вашем @tableb. Для диагностики, может быть, warn линии, чтобы вы могли видеть, откуда приходит 5.

my $num = 1; 
my %stationNumbers_ZJ = map {$_ => $num++} 
    qw(DONT MICH LEON RAPH SPLN SHRD CASY APRL 
    FOOT BEBP RKST DUBY SAMH GRAW KNYN); 

foreach (@tableb){ 
    chomp; 
    my ($netsta, $delay_time) = (split /\s+/)[1,9]; 
    my ($net, $sta) = split /\./,$netstat; 

    print "$net $sta\n" 
    $stat = $staionNumbers_ZJ{$sta} if ($net eq "ZJ") 
    print OUT "$stat \n"; 
    warn "\$stat: $stat>>$_<<\n" # for diagnostics 
} 
+2

Это очень хорошая и действительная точка, но я не уверен, что она действительно отвечает на вопрос, поскольку у нас есть свалка кода с недостаточной информацией. – Sobrique

Смежные вопросы