Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我尝试使用Perl的substr提取git repo URL时,为什么会得到额外的“]?_Perl - Fatal编程技术网

当我尝试使用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的