Я знаю, этому вопросу 4 года. Но я нашел ответ от ВЫ очень интересным, поскольку я не знал, что split
может работать так. Поэтому я хочу дополнить его выдержкой из perldoc split , которая объясняет это поведение для новых читателей. : -)
my $str = "1:2:3:4:5";
my ($a, $b) = split /:([^:]+)$/, $str;
# Capturing everything after ':' that is not ':' and until the end of the string
# Now $a = '1:2:3:4' and $b = '5';
С Perldoc :
Если PATTERN содержит группы захвата, то для каждого разделителя создается дополнительное поле для каждой подстроки, захваченной группой (в порядке, в котором группы указаны, согласно обратным ссылкам); если какая-либо группа не совпадает, то вместо подстроки она захватывает значение undef. Кроме того, обратите внимание, что любое такое дополнительное поле создается всякий раз, когда есть разделитель (то есть всякий раз, когда происходит разделение), и такое дополнительное поле не учитывается по отношению к LIMIT. Рассмотрим следующие выражения, оцененные в контексте списка (каждый возвращенный список приведен в соответствующем комментарии):
split(/-|,/, "1-10,20", 3)
# ('1', '10', '20')
split(/(-|,)/, "1-10,20", 3)
# ('1', '-', '10', ',', '20')
split(/-|(,)/, "1-10,20", 3)
# ('1', undef, '10', ',', '20')
split(/(-)|,/, "1-10,20", 3)
# ('1', '-', '10', undef, '20')
split(/(-)|(,)/, "1-10,20", 3)
# ('1', '-', undef, '10', undef, ',', '20')