如何仅在最后一次出现的分隔符上拆分Perl字符串?

kir*_*ika 13 perl split

我的$ 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)

  • 这将受益于解释,就像弗朗西斯科·扎拉博索在另一个答案中提供的那样。 (2认同)

gho*_*g74 8

你也可以用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)


Eug*_*ash 8

您可以使用匹配,而不是拆分:

my ($a, $b) = $str =~ /(.*):(.*)/;
Run Code Online (Sandbox Code Playgroud)


Fra*_*ozo 6

我知道,这个问题已经有 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)