我的$ str ="1:2:3:4:5"; my($ a,$ b)= split(':',$ str,2);
在上面的代码中,我使用limit作为2,因此$ a将包含1,其余元素将在$ b中.像这样我希望最后一个元素应该在一个变量中,而最后一个元素之前的元素应该在另一个变量中.
例
$str = "1:2:3:4:5" ;
# $a should have "1:2:3:4" and $b should have "5"
$str = "2:3:4:5:3:2:5:5:3:2"
# $a should have "2:3:4:5:3:2:5:5:3" and $b should have "2"
Run Code Online (Sandbox Code Playgroud)
YOU*_*YOU 18
split(/:([^:]+)$/, $str)
Run Code Online (Sandbox Code Playgroud)
你也可以用rindex()eg
my $str="1:2:3:4:5";
$i=rindex($str,":");
$a=substr($str,0,$i);
$b=substr($str,$i+1);
print "\$a:$a, \$b: $b\n";
Run Code Online (Sandbox Code Playgroud)
产量
$ perl perl.pl
$a:1:2:3:4, $b: 5
Run Code Online (Sandbox Code Playgroud)
我知道,这个问题已经有 4 年历史了。但我发现你的答案非常有趣,因为我不知道split可以这样工作。因此,为了新读者,我想用解释这种行为的perldoc 拆分的摘录来扩展它。:-)
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';
Run Code Online (Sandbox Code Playgroud)
从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')
Run Code Online (Sandbox Code Playgroud)