Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Вопрос по Hash::Util


Автор: ginnie 16.10.2008, 13:13
Уважаемые коллеги!

Сегодня смотрел код в модуле http://search.cpan.org/src/TTY/kurila-1.14_0/ext/Hash-Util/lib/Hash/Util.pm и натолкнулся на непонятные конструкции, типа

Код

use Scalar::Util < qw(reftype);


Код

sub lock_ref_keys {
    my($hash, < @keys) = < @_;


Код

my %original_keys = %( < map { ($_ => 1) } keys %$hash );


Кто-нибудь знает, что это (я имею ввиду символ <)?

Автор: amg 16.10.2008, 14:38
Есть предположение, что это фишка Perl 5.10, причем, похоже, недокументированная (в perlop). По крайней мере, в аналогичном модуле последнего Perl 5.8 ничего такого нет.

Автор: arto 16.10.2008, 15:46
а perldoc -m что говорит?

Автор: KSURi 16.10.2008, 15:55
Код

Internals::SvREADONLY $hash->{$key}, 0;

Оттуда же. Получается XS вызов из PP сорца. Прикольно.

Автор: ginnie 16.10.2008, 15:57
arto, у меня perl 5.8.8, поэтому модуль Hash::Util v0.05 (там все нормально). Последняя версия модуля 0.07 (именно в ней непонятные символы), но она для perl 5.10.

Автор: KSURi 16.10.2008, 15:59
Кстати непонятно почему в начале модуля нет вызова
Код

require 5.0010;

если это фишки 5.10 версии

Автор: arto 16.10.2008, 16:01
# perldoc -m Hash::Util | grep "use Scalar::Util"
use Scalar::Util qw(reftype);
# perl -v

This is perl, v5.10.0 built for i386-linux-thread-multi
...
#

ps. главное -- не умереть от опечатки в медицинском справочнике.

Автор: ginnie 16.10.2008, 16:02
KSURi, где Вы увидели "XS вызов"? Там вызов метода SvREADONLY из модуля Internals (кто-же виноват, что в модуле он транслируется в вызов XSUB  smile ).

Добавлено @ 16:03
arto, т.е. опечатка на CPAN? Какая у Вас версия модуля?

Автор: arto 16.10.2008, 16:07
да

# perl -MHash::Util -le 'print $Hash::Util::VERSION'
0.07

Автор: KSURi 16.10.2008, 16:18
Цитата(ginnie @  16.10.2008,  16:02 Найти цитируемый пост)
KSURi, где Вы увидели "XS вызов"? Там вызов метода SvREADONLY из модуля Internals (кто-же виноват, что в модуле он транслируется в вызов XSUB  smile ).

Я думаю смысл выражения был понятен, незачем к словам придираться. В модулях стандартной поставки perl 5.8 не было такой обертки для XS вызовов.

Автор: ginnie 16.10.2008, 16:45
KSURi, честно говоря я, когда увидел эту функцию в других модулях, подумал, что это из модуля http://search.cpan.org/author/STBEY/Internals-1.1/Internals.pm, но http://www.ddj.com/architect/184416222, что это не так. Более подробной информации пока не нашел.

P.S. Кое-что нашел (файл universal.c):

Код

newXSproto("Internals::SvREADONLY",XS_Internals_SvREADONLY, file, "\\[$%@];$");

XS(XS_Internals_SvREADONLY)    /* This is dangerous stuff. */
{
    dVAR;
    dXSARGS;
    SV * const sv = SvRV(ST(0));
    PERL_UNUSED_ARG(cv);

    if (items == 1) {
     if (SvREADONLY(sv))
         XSRETURN_YES;
     else
         XSRETURN_NO;
    }
    else if (items == 2) {
    if (SvTRUE(ST(1))) {
        SvREADONLY_on(sv);
        XSRETURN_YES;
    }
    else {
        /* I hope you really know what you are doing. */
        SvREADONLY_off(sv);
        XSRETURN_NO;
    }
    }
    XSRETURN_UNDEF; /* Can't happen. */
}


Код

perl -e 'print $_, $/ for (keys %Internals::);'

SvREFCNT
hv_clear_placeholders
hash_seed
SvREADONLY
HvREHASH
rehash_seed


Автор: KSURi 16.10.2008, 20:05
А вот это уже интересно. Спасибо за информацию.

Добавлено через 2 минуты
Если бы это был модуль с CPAN'a, то для него надо было делать use, которого там не было.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)