如何在Perl中获取字符串最后一位的索引?

oipij1gg  于 2023-02-19  发布在  Perl
关注(0)|答案(3)|浏览(170)

在Perl中,如何找到字符串中最后一位数字的索引?
示例:最后一位的Hello123xyz索引为7

tf7tbtn2

tf7tbtn21#

RE匹配字符串中的最后一个数字,@- variable获取匹配开始的索引:

#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;

sub last_digit_index($) {
    if ($_[0] =~ /\d\D*\z/) {
        return $-[0];
    } else {
        return -1;
    }
}

say last_digit_index("Hello123xyz"); # 7
yhxst69z

yhxst69z2#

我可能会在这里使用pos函数。与/g匹配,Perl会记住匹配停止的位置。该字符串上的下一个全局匹配将从上一个匹配停止的位置开始,因此将其隔离在子或块中,以避免对同一变量上的后续匹配产生奇怪的影响。
由于位置从0开始计数,因此下一个位置将比最后一位从1开始的位置大1。您可以决定是否要减去1:

use v5.10;

say last_digit_pos('Hello123xyz');

sub last_digit_pos {
    my( $string ) = @_;
    $string =~ m/^.*\d/sg;
    return pos($string);  # 6
    }

而且,如果字符串不匹配,pos不返回定义的值。

ibrsph3r

ibrsph3r3#

还可以利用List::MoreUtils::last_index

use List::MoreUtils qw(last_index);

my $last_digit_index = last_index { /[0-9]/ } split '', $string;

我觉得这很简单:使用split的典型用法将字符串分解为字符列表,并使用库通过普通正则表达式查找最后一个数字。
请注意,这是“昂贵的”,因为它为每个字符创建一个标量,并多次运行regex。因此,如果效率很重要--如果这是在一个绝对巨大的字符串上完成的,或者是在较小的字符串上多次完成的--那么最好寻找其他方法,或者至少在决定使用它之前对其进行基准测试。(注意,这必须是 * 非常多 * 的字符串才能看到效率的下降。)

相关问题