繁体   English   中英

为什么substr不会在字符串的末尾返回undef?

[英]Why does substr not return undef at the end of a string?

我不确定这是否是定义的行为。 我有以下代码:

use strict;
use warnings;
use Data::Dumper;

my $string = 'aaaaaa0aaaa';
my $char = substr($string, length($string), 1);
my $char2 = substr($string, length($string)+1, 1);

print Dumper($char);
print Dumper($char2);

除了在字符串结尾之后得到一个关于substr()警告之外,我对输出感到困惑:

$VAR1 = '';
$VAR1 = undef;

Perldoc说关于substr

substr EXPR,OFFSET,LENGTH

如果OFFSET和LENGTH指定部分位于字符串外部的子字符串,则仅返回字符串中的部分。 如果子字符串超出字符串的任何一端,则substr()返回未定义的值并产生警告。

length($string)length($string) + 1都超出了length($string) + 1的(零索引)结束,因此我不知道为什么substr在一个case中返回空字符串而在另一个case中返回undef 它是否与C用于字符串终止的NULL字符有关,并且在第一种情况下由substr以某种方式返回,因此该字符串有一个“不可见”的最后一个字符,不计算length 我错过了一些明显的东西吗?

这里有几个问题。 首先,您应该考虑substr 偏移量来指示字符之间的位置从而:

 S T R I N G
0 1 2 3 4 5 6

所以你可以看到,抵消6 -字符串的长度-是字符串的结尾,而不是超越它。

其次, substrlength参数作为返回字符数的上限,而不是要求。 这就是文档仅通过字符串中的部分返回的含义。

把这些结合在一起,就像一个呼叫substr 'STRING', 6, 1 -要求字符串的结尾最多一个角色-返回空字符串,而求回报超过字符串的结尾(或开始之前给undef

substr($string, length($string), 1)

这给了你一个空字符串,因为substr考虑了0 to len(str)之间的offset ,超出该范围的任何东西都是undef

所以, substr("aa", 2, 1); - >最后a会给你空字符串
和, substr("aa", 3, 1); - >会给你undef (子串完全超出范围)

同样: -

  • substr("aa", 2, 2); - >会在最后a (部分超出范围的子串)后给你空字符串

现在,对于第二个: -

substr($string, length($string) + 1, 1)

这已经超过了最后允许的offset 所以它返回undef值。

假设: -

$str = "abcd";

然后,索引将如下所示: -

  a   b   c   d             undef
0   1   2   3  len(str)  len(str) + 1

更新 : -

所以,正如@Borodin在他的帖子中解释的那样,字符d介于上例中的偏移3len(str)

但是,如果我们尝试访问除len(str)之外的任何东西,包括len(str) ,我们将获得一个empty字符串,如文档中所述 -

如果OFFSET和LENGTH指定部分位于字符串外部的子字符串,则仅返回字符串中的部分。

此外 ,如果我们试图访问任何超出len(str)len(str)我们将得到undef值,如文档 : -

如果子字符串超出字符串的任何一端,则substr()返回未定义的值并产生警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM