我有一个特殊字符串#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。
上述方法是否正确? 让我知道,我哪里出错了。请帮助我这方面。 提前致谢
答案 0 :(得分:2)
我认为最简单的方法是使用全局正则表达式
此程序扫描字符串中的所有管道@indices
字符,并将每个字符的偏移量推送到数组$indices[1]
。完成后,您可以通过index
访问第二个管道的位置,即8
我使用index
添加了一个有效的解决方案。作为choroba has explained,index
的最后一个参数 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";
}