что эта строка делает в Perl? ($ rowcol = ~ m / ([A-Z]?) ([0-9] +) /); - PullRequest
1 голос
/ 24 января 2010

Что эта строка делает в Perl?

my @parsedarray = ($rowcol =~ m/([A-Z]?)([0-9]+)/);

$ rowcol - это что-то вроде A1, D8 и т. Д. ... и я знаю, что скрипт как-то разбивает их, потому что следующие две строки:

my $row = $parsedarray[0];
my $col = $parsedarray[1];

Я просто не вижу, что делает эта строка ($ rowcol = ~ m / ([A-Z]?) ([0-9] +) /); и как это работает.

Ответы [ 5 ]

7 голосов
/ 24 января 2010

([A-Z]?) означает захват не более одной заглавной буквы. ([0-9]+) означает совпадение и захват хотя бы одной цифры.

В следующий раз вы можете установить YAPE :: Regex :: Explain , чтобы сообщить вам, что происходит. например,

 use YAPE::Regex::Explain;
 my $regex = "([A-Z]?)([0-9]+)";
 my $exp = YAPE::Regex::Explain->new($regex)->explain;
 print $exp."\n";

Обратите внимание, что m// в контексте списка возвращает все захваченные подстроки.

3 голосов
/ 24 января 2010

Разбитый на кусочки, вот что происходит:

my @parsedarray =                   # declare an array, and assign it the results of:
                  (
                   $rowcol =~       # the results of $rowcol matched against
                              m/    # the pattern:
                                ([A-Z]?)   # 0 or 1 upper-case-alpha characters (1st submatch),
                                           # followed by
                                ([0-9]+)   # 1 or more numeric characters (2nd submatch)
                               /x          # this flag added to allow this verbose formatting
                  );                # ...which in list context is all the submatches

Так что если $rowcal = 'D3':

my @parsedarray = ('D3' =~ m/([A-Z]?)([0-9]+)/);  # which reduces to:
my @parsedarray = ('D', '3');

Подробные сведения о регулярных выражениях можно найти по адресу perldoc perlrequick (краткое резюме), perldoc perlretut (учебное пособие) и perldoc perlre (все подробности) и различные операции с регулярными выражениями (сопоставление, подстановка, перевод) в perldoc perlop .

2 голосов
/ 24 января 2010

Оператор m // является сопоставлением с шаблоном, в основном синонимом //. Это соответствует необязательной первой букве, а затем 1 или более цифрам в столбце строки. Массив возвращается как результат сопоставления с каждым элементом, содержащим одну из сопоставленных групп (в скобках). Поэтому $ parsedarray [0] содержит букву (или ничего), а $ parsedarray [1] содержит цифры.

1 голос
/ 24 января 2010

It:

  • соответствует регулярному выражению (ноль или более заглавных букв, за которыми следует одно или несколько чисел.)
  • Захватывает две группы:
    • ноль или более букв
    • одно или несколько чисел
  • Назначает эти захваченные группы массиву @parsedarray

Пример кода для проверки:

use Data::Dumper;
my $rowcol = "A1";
my @parsedarray = ($rowcol =~ m/([A-Z]?)([0-9]+)/);
print Dumper(\@parsedarray);

выход:

$ VAR1 = ['A', '1'];

Обратите внимание, что если строка не имеет начальногозаглавная буква (например, "a1"), тогда она вернет пустую строку для $parsedarray[0].

0 голосов
/ 24 января 2010

Мой Perl немного заржавел, но если я понял ваш вопрос, ответ таков: он соответствует регулярному выражению:

необязательно любая заглавная буква между a и z, за которой следуют одна или несколько цифр числа, иназначает его rowcol

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...