2011/2/13 Ivan Petrov <[email protected]>: > допустим у нас есть SV *sv; // $val = \\5; >> >> тогда: >> SvROK(sv) == true >> SvIOK(sv) == false >> SvROK(SvRV(sv)) == true >> SvIOK(SvRV(sv)) == false >> SvIOK(SvRV(SvRV(sv))) == true >> SvROK(SvRV(SvRV(sv))) == false >> Ни раньше, ни сейчас извращаться не надо. >> > > c этими макросами-то все ясно, речь-то шла о других, об SvTYPE, а с ним > теперь будет > > SVt_IV == SvTYPE(SvRV(sv))) и SVt_IV == SvTYPE(SvRV(SvRV(sv)))) > > это приводит к тому что надо switch заменять на if'ы или окружать это > ifdef'ами, если мы хотим в switch отделять "ссылку на ссылку" от "ссылки на > int" > > а замена switch на многострочный if - else if это именно извращение. Ну... не я эти макароны писал ))
Просто в данном случае SvTYPE говорит, не о том "что содержится в SV", а о том какя "у SV внутренняя структура" (это мое предположение). Т.е. в частности, где лежит значение и какие еще поля доступны... А за то, как этим значением можно воспользоваться отвечают флаги, типа SVf_ROK. Но это философия, в общем... я бы в коде очень упрощенно использовал что-то вроде: если пусто: ... если RV: разобраться с объектами, магией и рекурсия по ссылке иначе: все остальное Конечно все очень сильно зависит от того, что надо в итоге получить... допустим Storable должен знать о внутренностях и зеркалировать всю структуру, чтобы иметь возможность восстановить назад, а JSON этого делать не обязан, ему достаточно знать, что если не RV, то если можно получить NV или IV, то выкинуть чило, а если нельзя, то взять строку... > > > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > > -- Vladimir Timofeev <[email protected]> -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
