[Cascavel-pm] Brincadeira / desafio aos Monges

Nilson Santos Figueiredo Junior acid06 em gmail.com
Sábado Março 11 19:35:31 PST 2006


On 3/11/06, Gabriel Vieira <gabriel.vieira em gmail.com> wrote:
> my $foo = "use php";
> {
> (my $foo = $foo) =~ s/php/Perl/ig;
> print $foo;
> }
> print ", dont $foo";
>
> é valido?

Quando você fez isso, você declarou uma nova variável explícitamente.
Apenas ocorreu de ela ter o mesmo nome que a anterior, mas estar num
escopo léxico diferente.

> my $foo = "use php";
> for("$foo") {s/php/Perl/; print};

Quando você fez isso, você declarou uma variável $_ - só que
implicitamente. Se isso é válido ou não de acordo com a descrição do
problema, aí eu não sei.

> $a = "use php";
> print &{sub { $_[0] =~ s/php/Perl/ and return $_[0]; }}($a);'

Essa solução é errada.
Você *alterou sim* o valor de $a. Basta você dar um "print $a" na
linha seguinte.

Quando você altera a array @_ dentro de uma função, você está
alterando *o valor original*. Por isso não é uma boa prática de
programação utilizar $_[0], $_[1], etc diretamente - a não ser que o
que você queira seja exatamente isso: alterar o valor original.

(Nota: $a e $b são variáveis especiais e nunca devem ser usadas em
nenhum código - a não ser, claro dentro de um bloco de sort() )

-Nilson Santos F. Jr.


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