Может кто-нибудь объяснить, чтобы получить лучшее понимание?
Вы должны начать осознавать две вещи:
контекстного список
скалярного контекст
Оператор матча, m//
, обеспечат разные результаты в зависимости от того, что находится на левой стороне вашего знака =
. Проверьте это:
use strict;
use warnings;
use 5.020;
my $result = "abc" =~ m/a(.)(.)/;
say $result; #=> 1
my @results = "abc" =~ m/a(.)(.)/;
for my $result (@results) {
say $result;
};
--output:--
b
c
$variable
может хранить только одну вещь, поэтому, когда есть переменная $ на левой стороне =
знака, то переменная $ смотрит на оператора матча, m//
, на правая сторона знака =
и звонит: «Эй, я могу хранить только одну вещь здесь, просто дай мне одну вещь, пожалуйста!» Оператор матча отвечает, возвращая 1, для true, если было совпадение; или 0, для false, если не было соответствия.
С другой стороны, когда @variable
находится на левой стороне =
знака, массив выглядит более оператору m//
и взывает, «Эй, я могу хранить кучу вещей здесь, так дайте мне куча вещей, пожалуйста! " Оператор соответствия отвечает, возвращая то, что соответствовало группам захвата в регулярном выражении, если было совпадение; если совпадение не было, оператор соответствия возвращает ()
.
В первом случае сообщается, что $variable
предоставляет оператору матча scalar context
. Во втором случае считается, что @variable
обеспечивает list context
для оператора состязания. Не позволяйте этим терминам вас пугать.Вы знаете, что они теперь означают.
Далее, когда вы пишете это:
my ($H,$M,$S) =
Вы создаете несколько переменных на левой стороне =
знака. В унисон они обращаются к оператору матча с другой стороны знака =
: «Эй, нас здесь много, дайте нам кучу вещей, пожалуйста! Этот конкретный синтаксис my
предоставляет list context
для оператора состязания который находится на правой стороне =
знака:
my ($group1, $group2) = "abc" =~ m/a(.)(.)/;
say $group1; #=> b
say $group2; #=> c
Обратите внимание, что если вы используете разделители для оператора матча являются m/.../
, то вы не должны писать ведущую m
, поэтому, как правило, вы увидите приведенный выше пример:
my ($group1, $group2) = "abc" =~ /a(.)(.)/;
Когда вы используете фигурные скобки, как и вы: m{...}{...}
, тогда вам нужно написать ведущий m
.
'()' обозначает группы захвата в регулярном выражении. Вы захватываете, генерируете список, а затем назначаете список LHS (скалярных переменных) – Sobrique