我知道,这个问题已经 4 岁了。但我发现YOU 的答案非常有趣,因为我不知道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')