![](/img/trans.png)
[英]Why Scalar::Util::reftype return `undef` instead of empty string?
[英]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 -字符串的长度-是在字符串的结尾,而不是超越它。
其次, substr
的length参数作为返回字符数的上限,而不是要求。 这就是文档仅通过字符串中的部分返回的含义。
把这些结合在一起,就像一个呼叫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
介于上例中的偏移3
和len(str)
。
但是,如果我们尝试访问除len(str)
之外的任何东西,包括len(str)
,我们将获得一个empty
字符串,如文档中所述 -
如果OFFSET和LENGTH指定部分位于字符串外部的子字符串,则仅返回字符串中的部分。
此外 ,如果我们试图访问任何超出len(str)
除len(str)
我们将得到undef
值,如文档 : -
如果子字符串超出字符串的任何一端,则substr()返回未定义的值并产生警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.