[l-desarrollo] Reutilizar STDIN como STDOUT en Perl

7 views
Skip to first unread message

Alberto Mijares

unread,
Mar 15, 2013, 7:40:31 PM3/15/13
to Aplicaciones y Desarrollo en Linux
Hola lista,

Tenía una inquietud que ya resolví de otra forma, pero una de las
ideas que se me había ocurrido para solucionar era recuperar la salida
estandar de un script y tomarla como entrada estandar sin usar la
función open(); todo esto con perl.

Igual quise hacer la consulta por si me sirve para una próxima
oportunidad. Yo no supe cómo...

Saludos


Alberto Mijares
_______________________________________________
l-desarrollo mailing list
l-desa...@velug.org.ve
http://listas.velug.org.ve/mailman/listinfo/l-desarrollo

Ernesto Hernández-Novich

unread,
Mar 15, 2013, 8:04:11 PM3/15/13
to l-desa...@velug.org.ve
On Fri, 2013-03-15 at 19:10 -0430, Alberto Mijares wrote:
> Hola lista,
>
> Tenía una inquietud que ya resolví de otra forma, pero una de las
> ideas que se me había ocurrido para solucionar era recuperar la salida
> estandar de un script y tomarla como entrada estandar sin usar la
> función open(); todo esto con perl.

No entiendo del todo la pregunta...

¿Quieres que si el programa Perl hace

print "foo\n"

si más adelante haces

my $x = <>;

entonces $x tenga "foo\n"?

¿Cuál es el problema que quieres resolver de esa forma? ¿Un programa que
se hace feedback a partir de una semilla originaria?
--
Ernesto Hernández-Novich - @iamemhn - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3

Alberto Mijares

unread,
Mar 15, 2013, 8:30:39 PM3/15/13
to Ernesto Hernández-Novich, Aplicaciones y Desarrollo en Linux
>
> No entiendo del todo la pregunta...
>
> ¿Quieres que si el programa Perl hace
>
> print "foo\n"
>
> si más adelante haces
>
> my $x = <>;
>
> entonces $x tenga "foo\n"?
>
> ¿Cuál es el problema que quieres resolver de esa forma? ¿Un programa que
> se hace feedback a partir de una semilla originaria?


Ok, el problema original era que: un método me devuelve un string con
varias lineas, pero solo necesitaba la primera linea.

Digamos:

$ answer = $obj->answer;

y el contenido de $answer puede ser algo como

uno
dos
tres

pero solo me interesa lo que diga la primera línea. Por eso pensé en algo como

print $answer;
$loquequiero = <>;

pero obviamente no funciona ni encontré cómo hacerlo de esa forma.

Lo que hice fue

$loquequiero = (split (/\n/, $answer))[0];

pero me quedé pensando si lo que se me ocurrió primero era una locura,
si era posible o si podría ser útil en algún momento.

Saludos


Alberto Mijares

Ernesto Hernández-Novich

unread,
Mar 15, 2013, 8:53:48 PM3/15/13
to Aplicaciones y Desarrollo en Linux
On Fri, 2013-03-15 at 20:00 -0430, Alberto Mijares wrote:
[...]

> Ok, el problema original era que: un método me devuelve un string con
> varias lineas, pero solo necesitaba la primera linea.
>
> Digamos:
>
> $ answer = $obj->answer;
>
> y el contenido de $answer puede ser algo como
>
> uno
> dos
> tres
>
> pero solo me interesa lo que diga la primera línea. Por eso pensé en algo como
>
> print $answer;
> $loquequiero = <>;

Por supuesto. Podrías usar IO::Scalar para simular eso.

> pero obviamente no funciona ni encontré cómo hacerlo de esa forma.
>
> Lo que hice fue
>
> $loquequiero = (split (/\n/, $answer))[0];

Esto es más idiomático y claro en intención.

> pero me quedé pensando si lo que se me ocurrió primero era una locura,
> si era posible o si podría ser útil en algún momento.

TIMTOWTDI


--
Ernesto Hernández-Novich - @iamemhn - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3

Alejandro Imass

unread,
Mar 15, 2013, 11:17:37 PM3/15/13
to Aplicaciones y Desarrollo en Linux, Ernesto Hernández-Novich
2013/3/15 Alberto Mijares <amij...@gmail.com>:
>>

[...]

>
> Ok, el problema original era que: un método me devuelve un string con
> varias lineas, pero solo necesitaba la primera linea.
>
> Digamos:
>
> $ answer = $obj->answer;
>
> y el contenido de $answer puede ser algo como
>
> uno
> dos
> tres
>

[...]

> pero solo me interesa lo que diga la primera línea. Por eso pensé en algo como
>
> print $answer;
> $loquequiero = <>;
>
> pero obviamente no funciona ni encontré cómo hacerlo de esa forma.
>
> Lo que hice fue
>
> $loquequiero = (split (/\n/, $answer))[0];
>

Esta hubiese sido mi primera opción y se ve claro lo que quieres
hacer. Le puedes quitar algunos paréntesis y se ve más claro:

(split /\n/, $answer)[0];

> pero me quedé pensando si lo que se me ocurrió primero era una locura,
> si era posible o si podría ser útil en algún momento.
>

El uso de <> no es poco común con filehandles re-dirigidos, etc. pero
para el problema en mano me parece que el split es mucho mas claro.
Sin embargo supongamos que el problema fuese obtener la primera línea
de un archivo gigante, el uso del fh fuese lo ideal, pero entonces
sería estúpido montar el archivo en RAM para esto y estarías usando un
fh común y corriente, cerrándolo luego de obtener la primera línea.

Como dijo el gran Kernighan:

Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by
definition, not smart enough to debug it.

Saludos,

--
Alejandro Imass
Reply all
Reply to author
Forward
0 new messages