[Rio-pm] string --> coderef

breno breno em rio.pm.org
Domingo Agosto 24 15:28:34 PDT 2008


Eden, $ref = sub { $a }; é o que eu queria, exceto que.. não é o que
eu queria! (vc vai entender)

Deixa eu tentar ser específico quanto ao problema, assim quem
puder/quiser pode até testar isso:

suponha:

$perl -pe 's/a/b/' bla.txt

para saber como o "perl" transformou o seu código, vc pode usar o
B::Deparse do core:

$ perl -MO=Deparse -pe 's/a/b/'

LINE: while (defined($_ = <ARGV>)) {
    s/a/b/;
}
continue {
    print $_;
}
-e syntax OK


Eu queria fazer isso de dentro do meu programa, sem ter que recorrer a
um qx()/system(). Felizmente, o B::Deparse já possui uma interface de
uso como módulo, mas é relativamente pobre, com apenas um método de
parsing. Aparentemente, para repetir o comportamento acima, eu deveria
fazer algo como:


my $d = B::Deparse->new('-pe');
my $body = $d->coderef2text( sub { s/a/b/ } );
print $body;  # quero que aqui tenha o mesmo resultado da linha de comando

E funciona perfeitamente. O problema é que o que eu tenho não é  o
coderef da função, e sim uma string com o que foi digitado exatamente
como na linha de comando, algo como:

my $str = 's/a/b';

A pergunta é como fazer o "coderef2text()" entender o valor de $str
como o conteúdo da sub, fazendo o deparsing corretamente. Por isso
disse que sub { $str }  é exatamente o que eu queria. Seria, se
houvesse essa interpolação (se ele transformasse na hora de passar pra
coderef o sub {$str }  em sub { s/a/b/ }, mas não é o que acontece).

Tá difícil, vou acabar perdendo a preguiça e olhando o código do B::Deparse =P

Alguém tem alguma idéia?

[]s

-b


2008/8/24 Eden Cardim <edencardim em gmail.com>:
> 2008/8/24 breno <breno em rio.pm.org>:
>> Pessoal,
>>
>> estou com um problema aqui que pode ter uma solução muito simples ou
>> completamente impossível (provavelmente muito simples mas estou com
>> muito sono para descobrir).
>>
>> tenho uma variável $a = ' print "oi" '
>>
>> e quero transformá-la em um coderef. O mais próximo que cheguei foi:
>>
>> my $ref = sub { eval $a };
>>
>>
>> Desse jeito, posso chamar a coderef qdo quiser. Mas isso não funciona
>> para mim pois a função que estou chamando me retorna o conteúdo do
>> coderef como uma string (sim, eu passo uma string e quero ela de
>> volta, não perguntem - eu juro que não é um problema XY), ou seja, eu
>> quero que ele me retorne a string ' print "oi" ' mas desse jeito ele
>> me retorna a string 'eval $a'.
>>
>> Em suma, alguém sabe como transformar uma string-com-código numa
>> coderef com esse mesmo código (e não apenas "fazendo a mesma coisa")?
>>
>> Qq ajuda será muito bem vinda!
>
> Cara, juro que não entendi o teu problema...
>
> $ref->() vai executar o código que está em $a. se você quer a string
> de volta, $ref = sub { $a } resolve. Mas parece que você quer algo
> mais sofisticado e não estou entendendo o que é.
>
> --
> edenc.vox.com
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>


Mais detalhes sobre a lista de discussão Rio-pm