使用perl通过其偏移量查找字符串中特殊字符的索引

时间:2015-08-19 11:12:50

标签: perl

我有一个特殊字符串#34; |" [管]。在这里,我想知道管道索引值对它的偏移值。

尝试使用以下代码。

my $string = "json|xsp|xml|dml|xspt";
my $lc_i = index( $string, "|", 2);
print " lobcol index of string : $string is : $lc_i \n";

输出:

lobcol index of string : json|xsp|xml|dml|xspt is : 4

但是,我希望$lc_i值为:8。

上述方法是否正确? 让我知道,我哪里出错了。请帮助我这方面。 提前致谢

2 个答案:

答案 0 :(得分:2)

我认为最简单的方法是使用全局正则表达式

此程序扫描字符串中的所有管道@indices字符,并将每个字符的偏移量推送到数组$indices[1]。完成后,您可以通过index访问第二个管道的位置,即8

我使用index添加了一个有效的解决方案。作为choroba has explainedindex的最后一个参数 POSITION 是一个字符偏移量到它应该开始查看的字符串中。因此,如果use strict; use warnings; use v5.10; my $string = "json|xsp|xml|dml|xspt"; { my @indices; push @indices, $-[0] while $string =~ /\|/g; say "@indices"; } { my @indices; my $offset = 0; while () { my $index = index($string, '|', $offset); last if $index < 0; push @indices, $index; $offset = $index + 1; } say "@indices"; } 在偏移量4处找到您的第一个管道,您希望第二次使​​用 POSITION 为5来调用它,否则它将再次找到相同的管道

我希望你们同意我的观点,即正则表达式解决方案更清晰,更简洁

4 8 12 16
4 8 12 16

输出

touchesBegan

答案 1 :(得分:1)

Nginx documentation的第三个参数是字符串中的位置,而不是出现次数。您必须创建自己的子例程:

sub nth_index {
    my ($string, $substr, $count) = @_;
    my $pos = 0;
    for (1 .. $count) {
        $pos = 1 + index $string, $substr, $pos;
        return -1 if $pos == 0;
    }
    return $pos - 1
}

my $string = '|json|xsp|xml|dml|xspt|';
for my $i (0 .. 8) {
    my $lc_i = nth_index($string, '|', $i);
    print "lobcol $i-th index of string : $string is : $lc_i.\n";
}