「正確に」、あなたは尋ねますか?
通常、substr
退屈な文字列 (PV with POK) を返します。
$ perl -MDevel::Peek -e'$_="abcd"; Dump("".substr($_, 1, 2));'
SV = PV(0x99f2828) at 0x9a0de38
REFCNT = 1
FLAGS = (PADTMP,POK,pPOK)
PV = 0x9a12510 "bc"\0
CUR = 2
LEN = 12
ただし、substr
左辺値 (割り当て可能な値) が期待される場所で が評価されると、魔法のスカラー (PVLV と GMG (魔法の取得) および SMG (魔法の設定)) が返されます。
$ perl -MDevel::Peek -e'$_="abcd"; Dump(substr($_, 1, 2));'
SV = PVLV(0x8941b90) at 0x891f7d0
REFCNT = 1
FLAGS = (TEMP,GMG,SMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x8944900
MG_VIRTUAL = &PL_vtbl_substr
MG_TYPE = PERL_MAGIC_substr(x)
TYPE = x
TARGOFF = 1
TARGLEN = 2
TARG = 0x8948c18
FLAGS = 0
SV = PV(0x891d798) at 0x8948c18
REFCNT = 2
FLAGS = (POK,pPOK)
PV = 0x89340e0 "abcd"\0
CUR = 4
LEN = 12
この魔法のスカラーは、susbtr
(TARG、TARGOFF、および TARGLEN) に渡されるパラメーターを保持します。が指すTARG
スカラー ( に渡された元のスカラーsubstr
) が最後に繰り返されていることがわかります (下部に表示される 0x8948c18 の SV)。
この魔法のスカラーを読み取ると、代わりに関連する関数が呼び出されます。同様に、書き込みは関連する別の関数を呼び出します。これらの関数は、渡された文字列の選択された部分をsubstr
読み取ったり変更したりします。
perl -E'
$_ = "abcde";
my $ref = \substr($_, 1, 3); # $$ref is magical
say $$ref; # bcd
$$ref = '123';
say $_; # a123e
'