1
% perl -Ilib -MDevel::Peek -le '$a="34567"; $a=~s/...//; Dump($a)' 
SV = PV(0x8171048) at 0x8186f48   # replaced "12345" with "34567"
  REFCNT = 1
  FLAGS = (POK,OOK,pPOK)
  OFFSET = 3
  PV = 0x8181bdb ( "34\003" . ) "67"\0
  CUR = 2
  LEN = 9

( "12\003" . )チョップされた部分の2つのゼロはどこ2から3来ていますか?

なぜ私はこの種の出力を切り刻まれた部分で取得するの( "34\003" . )ですか?

4

2 に答える 2

2

バグ?「\003」は8進数形式のchr(3)です。でも:

$ perl -Ilib -MDevel::Peek -le '$a="12345"; $a=~s/...//; Dump($a)'
SV = PVIV(0x869b0bc) at 0x86a5060
  REFCNT = 1
  FLAGS = (POK,OOK,pPOK)
  IV = 3  (OFFSET)
  PV = 0x869fac3 ( "123" . ) "45"\0
  CUR = 2
  LEN = 5

私はそれを複製することはできません。どのバージョンのperlを使用していますか?

()の文字列バッファの一部は予約されていますが、現在使用されていないことに注意してください。

于 2011-08-01T06:53:19.590 に答える
1

Windowsでperl5.12.2を使用してsid_comと同じ結果が得られます。ただし、文字列の長さは、CURとにかく構造のフィールドから取得されます。これがバグである理由がわかりません。文字列バッファの残りの部分に任意のバイトが存在する可能性があります。

于 2011-08-01T08:12:50.537 に答える