cpan

まずは舌足らずをお詫び。

YappoLogs: Internals::SvREADONLY
danさんの
ただし、これではscalarしかflagをいじれません。というわけで、同様のことをXSでやるようにするモジュールを書いたというわけです。
これは間違いでARRAYもHASHも弄れます。

これは、s/scalar/PV一つ/gですね。

どういうことかというと、PVAVとしてのarray, PVHVとしてのhashはread-onlyに出来ても、その中身は違うということ。

% perl -MDevel::Peek -le '@a=(1,2);Internals::SvREADONLY(@a,1);Dump \@a'
SV = RV(0x1804cdc) at 0x1804cd0
  REFCNT = 1
  FLAGS = (TEMP,ROK)
  RV = 0x1812670
  SV = PVAV(0x1805ca8) at 0x1812670
    REFCNT = 2
    FLAGS = (READONLY)
    ARRAY = 0x1101c50
    FILL = 1
    MAX = 3
    ARYLEN = 0x0
    FLAGS = (REAL)
    Elt No. 0
    SV = IV(0x1804dec) at 0x1804df0
      REFCNT = 1
      FLAGS = (IOK,pIOK)
      IV = 1
    Elt No. 1
    SV = IV(0x1804f3c) at 0x1804f40
      REFCNT = 1
      FLAGS = (IOK,pIOK)
      IV = 2

ただし、指摘のようにInternals::SvREADONLY()$array[1]$hash{one}も引数に取れるので、これを使うだけでXSを使わずにConst.pmのようなことは出来ます。というか、最初の実装はそうでした。

ただし、Internals::SvREADONLY($_) for (@array)のような、単純なPerlのループでも以外と時間がかかるもの。というわけで、List::Utilの各種関数と同じく、iterationもXS化した次第です。

それはまあいいのだけど、問題は

YappoLogs: Internals::SvREADONLY
なにが言いたいかというとConstがUNAUTHORIZEDだという事

だよなあ。ImmutableとかにすればOKになる?

というわけで、何が言いたいかというと、名前募集中ということ。

Dan the Perl Monger