Регулярное выражение Perl не работает

Здравствуйте, я пытаюсь получить пару вещей, используя скрипт Perl.

my $fileName = "I_Payment_OK_2";
my ($msgType, $OfaCode, $msgCount) = $parseFileName;

#my $msgType = $parseFileName;
print $OfaCode;
print $msgType;
print $msgCount;

# parse the values from filename
sub  parseFileName {
     # parse the message type
     if($fileName =~ m/^(I|O)/) {
        $var1 = $1;
     }  
     # parse the OFAC trace keyword
     if($fileName =~ m/^[A-Z_][A-Za-z_]([A-Z]+)\w(\d+)$/) {
        $var2 = $2;
        $var3 = $3;
     }
     # return the message type & OFAC trace
     return ($var1, $var2, $var3);
     #return $var1; 
}

Ничего не печатается. Может ли кто-нибудь помочь мне с этим, что происходит не так?

Спасибо


person avirup    schedule 27.05.2012    source источник


Ответы (2)


Вы никогда не вызываете parseFileName(). Вероятно, my ($msgType, $OfaCode, $msgCount) = $parseFileName; должно быть my ($msgType, $OfaCode, $msgCount) = parseFileName();

person lanzz    schedule 27.05.2012
comment
Если вы удовлетворены ответом, вы должны принять его, нажав на серый флажок слева :) - person lanzz; 27.05.2012
comment
Можете ли вы заглянуть в часть кода с регулярным выражением, кажется, что она не работает. - person avirup; 27.05.2012
comment
Ваше регулярное выражение требует, чтобы ввод имел только заглавные буквы после второго символа. Часть Payment_OK должна совпадать с частью ([A-Z]+), а это не так. - person lanzz; 27.05.2012
comment
Я хочу получить OK и номер 2 (как пример, приведенный в коде) - person avirup; 27.05.2012
comment
$fileName =~ /([A-Z]+)_(\d+)$/ должен это сделать, например. Поскольку я понятия не имею, какой другой ввод вы могли бы ожидать, это регулярное выражение может не подходить для вашей ситуации. - person lanzz; 27.05.2012
comment
Да Lanzz с точки ввода я должен всегда ожидать cap char на месте OK и тогда в конце я должен получить число :). Спасибо. - person avirup; 27.05.2012
comment
@Borodin: у avirup есть репутация 1, он может не знать, что ответы должны быть приняты. - person lanzz; 27.05.2012
comment
@Бородин. Нет, просьба принять ответ в качестве решения не является ошибкой. На самом деле это хорошо в рамках принятых политик SO, чтобы направлять пользователей к принятию ответов. Поскольку принятие ответа - это способ поблагодарить здесь. - person tuxuday; 27.05.2012
comment
@tuxuday: я согласен, но комментарий был сделан очень скоро после публикации вопроса, и пока был только один ответ. Настаивать на том, чтобы ОП принял это, было преждевременно, и это должен был быть общий совет принять ответы, которые сработали для него, а не этот конкретный. - person Borodin; 28.05.2012
comment
@Borodin: подтолкнуть ОП к официальному принятию ответа, который они уже приняли в письменной форме? В самом деле? хорошо, спасибо за вашу критику, и я обязательно буду формулировать свои комментарии в более политкорректной манере в будущем. - person lanzz; 28.05.2012

Вы должны всегда использовать use strict и use warnings в начале вашей программы и объявлять все переменные в точке их первого использования с помощью my. Это особенно актуально, когда вы просите о помощи с вашим кодом, поскольку эта мера может быстро выявить множество простых ошибок.

Судя по вашему коду, вы должны вместо этого использовать split.

Эта программа разбивает строку имени файла по символам подчеркивания и извлекает первое и два последних поля.

use strict;
use warnings;

my $fileName = "I_Payment_OK_2";

my ($msgType, $OfaCode, $msgCount) = (split /_/, $fileName)[0, -2, -1];

print $msgType, "\n";
print $OfaCode, "\n";
print $msgCount, "\n";

вывод

I
OK
2
person Borodin    schedule 27.05.2012
comment
Спасибо Бородин за ценный комментарий. - person avirup; 27.05.2012