9

これが定義された動作であるかどうかはわかりません。私は次のコードを持っています:

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);

文字列の終わりを過ぎたという警告が1つ表示されるだけでなくsubstr()、出力について混乱しています。

$VAR1 = '';
$VAR1 = undef;

Perldocは次のように述べていsubstrます:

substr EXPR、OFFSET、LENGTH

OFFSETとLENGTHが部分的に文字列の外側にある部分文字列を指定した場合、文字列内の部分のみが返されます。サブ文字列が文字列のいずれかの端を超えている場合、substr()は未定義の値を返し、警告を生成します。

length($string)とは両方とも文字列の(ゼロインデックスの)末尾を超えているため、ある場合と別の場合に空の文字列を返すlength($string) + 1理由がわかりません。Cが文字列の終了に使用し、最初のケースで何らかの形で返されるNULL文字と関係があるので、この文字列にはカウントされない「非表示」の最後の文字がありますか?ここで明らかな何かが欠けていますか?substrundefsubstrlength

4

2 に答える 2

8

ここにはいくつかの問題があります。まず、文字間の位置を示すsubstr オフセットを考慮する必要があります。

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

オフセット 6 (文字列の長さ) が文字列の末尾にあり、それを超えていないことがわかります。

次に、長さパラメーターはsubstr、返される文字数の上限として機能し、要件ではありません。これは、ドキュメントが文字列内の一部のみを返すことで意味することです。

これらをまとめると、次のような呼び出し(文字列の末尾に最大1 文字substr 'STRING', 6, 1要求する) は空の文字列を返しますが、文字列の末尾 (または先頭の前) を超えるものを要求すると.undef

于 2012-10-26T12:47:19.403 に答える
5
substr($string, length($string), 1)

は の間をsubstr考慮し、その範囲を超えるものは であるため、これにより空の文字列が得られました。offset0 to len(str)undef

したがって、substr("aa", 2, 1);-> は最後に空の文字列を返しa
、 -> は(完全に範囲外の部分文字列)を返しsubstr("aa", 3, 1);ます。undef

同様に: -

  • substr("aa", 2, 2);-> 最後に空の文字列を 返しますa(部分文字列の一部が範囲外)

さて、2番目のものについて: -

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() は未定義の値を返し、警告を生成します。

于 2012-10-26T11:52:07.183 に答える