当我尝试使用Perl的substr提取git repo URL时,为什么会得到额外的“]?
因此,我从一段相当简单的代码中发现了一些奇怪的行为。我不太清楚为什么会这样。这两个片段似乎应该做同样的事情:当我尝试使用Perl的substr提取git repo URL时,为什么会得到额外的“]?,perl,Perl,因此,我从一段相当简单的代码中发现了一些奇怪的行为。我不太清楚为什么会这样。这两个片段似乎应该做同样的事情: my $s = "some-package [git://github.com/repo/some-package]"; $s = substr($s, 0, length($s)-1); $s = substr($s, index($s, "[")+1); print $s . "\n"; 及 但对于每段代码,我得到的结果如下: git://github.com/repo/so
my $s = "some-package [git://github.com/repo/some-package]";
$s = substr($s, 0, length($s)-1);
$s = substr($s, index($s, "[")+1);
print $s . "\n";
及
但对于每段代码,我得到的结果如下:
git://github.com/repo/some-package
git://github.com/repo/some-package]
不太清楚为什么第二个代码段没有删除最后一个字符。在第二个代码段中,您要求提供过多的字符:您开始从位置索引$s获取子字符串,[+1,但要求提供尽可能多的长度$s-1个字符,例如,所有包的长度[git://....]职员减1。你应该取长度$s-index$s,[-2 但实际上,您应该只使用正则表达式来完成这些任务
if ($s =~ m|\[(git://.*?)\]|) {
my $repo = $1;
print "$repo\n";
}
在第二个代码段中,您要求提供的字符太多:您开始从位置索引$s中获取子字符串,[+1,但要求提供的字符长度不超过$s-1,例如所有some包的长度[git://....]职员减1。你应该取长度$s-index$s,[-2 但实际上,您应该只使用正则表达式来完成这些任务
if ($s =~ m|\[(git://.*?)\]|) {
my $repo = $1;
print "$repo\n";
}
第三个参数是一个长度,而不是一个索引。因此,考虑字符串“ABCDE”。B的索引是1。要从C开始,所以起始位置是2。字符串的长度是5。从中减去1,得到4。因此,
$s = 'abcde';
substr($s, index($s, 'b') + 1, length($s) - 1);
转化为
substr($s, 2, 4)
你需要的是
my $s = "some-package [git://github.com/repo/some-package]";
my $i = index($s, '[') + 1;
say substr($s, $i, length($s) - $i - 1);
您还可以为此使用:
my $s = "some-package [git://github.com/repo/some-package]";
say split(qr{ \S+ \s+ \[ | \] }x, $s);
第三个参数是一个长度,而不是一个索引。因此,考虑字符串“ABCDE”。B的索引是1。要从C开始,所以起始位置是2。字符串的长度是5。从中减去1,得到4。因此,
$s = 'abcde';
substr($s, index($s, 'b') + 1, length($s) - 1);
转化为
substr($s, 2, 4)
你需要的是
my $s = "some-package [git://github.com/repo/some-package]";
my $i = index($s, '[') + 1;
say substr($s, $i, length($s) - $i - 1);
您还可以为此使用:
my $s = "some-package [git://github.com/repo/some-package]";
say split(qr{ \S+ \s+ \[ | \] }x, $s);
这是使用Perl正则表达式的理想场所 你想找到两个括号之间的字符串,对吗?下面是你要做的
my $s = "some-package [git://github.com/repo/some-package]";
if ( $s =~ /\[(.+)\]/ ) {
my $repo = $1;
}
else {
die "Couldn't find a string between two brackets";
}
在线上有很多很好的正则表达式教程可以帮助您入门。一旦您使用正则表达式进行字符串解析,您会想知道如何使用index+substr。这是使用Perl正则表达式的理想场所 你想找到两个括号之间的字符串,对吗?下面是你要做的
my $s = "some-package [git://github.com/repo/some-package]";
if ( $s =~ /\[(.+)\]/ ) {
my $repo = $1;
}
else {
die "Couldn't find a string between two brackets";
}
在线上有很多很好的正则表达式教程可以帮助你入门。一旦你使用正则表达式进行字符串解析,你会想知道你是如何使用index+substr的