<div dir="ltr">Vaya,<div style>Menuda ayuda completa, pues clarísimo todo chicos.</div><div style><br></div><div style>Muchísimas gracias ;)</div><div style><br></div><div style>Use BCN::PerlMongers  # :D</div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">El 12 de abril de 2013 21:00,  <span dir="ltr"><<a href="mailto:barcelona-pm-request@pm.org" target="_blank">barcelona-pm-request@pm.org</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Envieu les aportacions de Barcelona-pm a la llista de correu a<br>
        <a href="mailto:barcelona-pm@pm.org">barcelona-pm@pm.org</a><br>
<br>
Per a subscriure-us o cancel·lar subscripcions a través de la web,<br>
aneu a<br>
        <a href="http://mail.pm.org/mailman/listinfo/barcelona-pm" target="_blank">http://mail.pm.org/mailman/listinfo/barcelona-pm</a><br>
o bé, si voleu utilitzar el correu electrònic, envieu un missatge<br>
amb la paraula «help» a l'assumpte o al cos del missatge, adreçat a<br>
        <a href="mailto:barcelona-pm-request@pm.org">barcelona-pm-request@pm.org</a><br>
<br>
Podeu dirigir-vos a la persona encarregada de la gestió de la llista<br>
a<br>
        <a href="mailto:barcelona-pm-owner@pm.org">barcelona-pm-owner@pm.org</a><br>
<br>
En respondre, és recomanable que editeu la línia de l'Assumpte, de<br>
manera que sigui més específica que "Re: Contents of Barcelona-pm<br>
digest..."<br>
<br>
<br>
Temes d'avui:<br>
<br>
   1. Re: Curso; dudas(regex, substr vs unpack, subrutinas)<br>
      (Alejandro Exojo)<br>
   2. Re: Curso; dudas(regex, substr vs unpack, subrutinas)<br>
      (Gonzalo Pérez de Olaguer Córdoba)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Thu, 11 Apr 2013 23:39:44 +0200<br>
From: Alejandro Exojo <<a href="mailto:suy@badopi.org">suy@badopi.org</a>><br>
To: <a href="mailto:barcelona-pm@pm.org">barcelona-pm@pm.org</a><br>
Subject: Re: [bcn-pm] Curso; dudas(regex, substr vs unpack,<br>
        subrutinas)<br>
Message-ID: <<a href="mailto:201304112339.45516.suy@badopi.org">201304112339.45516.suy@badopi.org</a>><br>
Content-Type: Text/Plain;  charset="iso-8859-15"<br>
<br>
El Jueves, 11 de abril de 2013, Sergio González Rodríguez escribió:<br>
> ¡Hola mongers!<br>
><br>
> Varias cosas:<br>
><br>
> 1) Agradeceros la repetición del curso<br>
><br>
> foreach my $persona (@personasQueHicieronPosibleElCurso) {<br>
>     print "Gracias $persona ;)\n";<br>
> };<br>
<br>
Este es el primer correo que mando, y decir que también hice el curso, y que<br>
me ha picado mucho la curiosidad, y estoy pasándomelo bien convirtiendo mi<br>
blog a Mojolicious. Está siendo una experiencia interesante. :)<br>
<br>
Aunque yo lo diría:<br>
<br>
say "¡Gracias $_!" foreach @personasQueHicieronPosibleElCurso; # ;-)<br>
<br>
Voy a intentar responderte para afianzar mis conocimientos, pero no te lo tomes<br>
nada en serio, porque he escrito unos 3 programas en Perl hasta la fecha. :-)<br>
<br>
> 2) Tengo unas cuantas dudas, espero que no sean muy noobs ni rebuscadas y<br>
> os entretengáis echándome un cable, os lo agradeceré:<br>
><br>
> 2.1) substr vs unpack<br>
><br>
> En el Perl cookbok (cap.1 accessing substrings:<br>
> <a href="http://docstore.mik.ua/orelly/perl/cookbook/ch01_02.htm" target="_blank">http://docstore.mik.ua/orelly/perl/cookbook/ch01_02.htm</a> ) dice que podemos<br>
> usar unpack para extraer substrings más rapidamente que con substr.<br>
><br>
> Teniendo una $cadena = 'cadena de texto'<br>
> Podemos extraer el 'de' así:<br>
>     substr($cadena, 6, 3);<br>
>     o asi<br>
>     unpack("x7 A2", $cadena);<br>
><br>
> He mirado el perldoc de unpack(<br>
> <a href="http://perldoc.perl.org/functions/unpack.html" target="_blank">http://perldoc.perl.org/functions/unpack.html</a> ), y otro tutorial(<br>
> <a href="http://www.perlmonks.org/?node_id=557655" target="_blank">http://www.perlmonks.org/?node_id=557655</a> )<br>
> y no me queda nada claro "de qué va el unpack..." simplemente que es más<br>
> rápido que el substr porque lo dice el cookbook...<br>
><br>
> El debate sería: ¿Qué os parece usar el unpack como en este ejemplo frente<br>
> al substr? ¿Lo usáis? ¿Cuando y cuando no?<br>
<br>
Yikes! Ni flores, pero por lo que entiendo de la documentación de pack(),<br>
parece estar más orientado a bytes que a cadenas. Pensar en bytes (i.e. 8<br>
bits), es un error en estos días en que el texto está muy frecuentemente en<br>
utf-8. En utf-8 el texto de un sólo carácter puede ocupar 1, 2, o más bytes.<br>
La Ñ, la Ç, etc., ocuparán 2 bytes, por ejemplo. Si estás pensando en cadenas,<br>
creo que lo correcto es usar substr.<br>
<br>
> 2.2) Llamadas a subrutinas<br>
> marine();<br>
> o<br>
> &marine();<br>
><br>
> ¿simple cuestión de estilo o tiene alguna otra implicación?<br>
<br>
Por lo que he ido leyendo, el & es innecesario estos días, salvo en<br>
situaciones que raramente vayamos a ver. Es más, si no me suena mal del Modern<br>
Perl, puede hacer que se comporte de manera diferente. Conclusión: no lo uses<br>
salvo que realmente sepas lo que estás haciendo.<br>
<br>
> 2.3)Expresiones regulares<br>
> Leyendo de un archivo con líneas que contienen lo siguiente:<br>
> FBtr123;blablabla<br>
> Y<br>
> FBtr123,FBtr567,FBtr120;blabla<br>
><br>
> Para almacenar estos match estoy haciendo:<br>
> push(@FBtr, $1) if ($line=~/(FBtr\d+);/ || $line=~/(FBtr\d+,.+);/ )<br>
> #guardar un match si sólo hay uno, y guardarlos todos si sólo<br>
> ¿Es esto lo mejor?<br>
><br>
> ¿o seria mejor así?<br>
> push(@FBtr, $1) if ($line=~/(FBtr\d+);||(FBtr\d+,.+);/ )<br>
><br>
> *empecé a descubrir algo de los lookahead,  y pensé que podría<br>
> implementarlo para ver si hay 'un solo fbtr'  o 'más de uno' pero creo que<br>
> también eso sería liar el rizo innecesariamente ¿os parece?<br>
<br>
En esto sí que no sé que decir porque no estoy seguro de lo que estás buscando<br>
exactamente. Tampoco ayuda que, al ponerlo todo en una línea, si no sabes<br>
claramente lo que quería hacer el que lo ha escrito, es difícil. :-)<br>
<br>
Aún estoy acostumbrado a usar llaves para marcar todos los bloques<br>
explícitamente, salvo que sea algo muy sencillo como el foreach del principio<br>
del correo.<br>
<br>
> 2.4) Paso de argumentos a subrutinas<br>
> Pasando por valor, la subrutina se hace una copia interna del argumento,<br>
> así que no podemos devolverlo fuera de la sub (o si lo devolvemos no será<br>
> el modificado dentro de la sub)<br>
<br>
Si lo devuelves como valor de retorno de la subrutina, pues quien invoque la<br>
subrutina tendrá que guardarlo de alguna manera. Pero si dentro lo modificas,<br>
pues lógicamente la modificación se pierde si no sale afuera de alguna manera.<br>
<br>
> Pasando por referencia, la sub puede modificar dichos argumentos.<br>
> Pero, si quisiera pasar un array, aunque no quiera que lo modifique; ¿<br>
> Debería pasarlo referenciado, por que si no hará la ¿expansión?/flatten del<br>
> array ?<br>
> Es decir<br>
> $marine($a, \@b) #Bien?<br>
> &marine($a, @b) #Mal porque expande @b?<br>
<br>
En el primer caso la subrutina recibe dos parámetros, y están bien<br>
diferenciados (el segundo será una referencia seguro, el primero... bueno,<br>
podría serlo si $a lo es). En el segundo, la subrutina recibe tantos como<br>
elementos tenga @b más uno adicional, $a.<br>
<br>
No creo que sea importante como lo hagas, siempre que @b no tenga una<br>
barbaridad de datos, ya que al pasarlos por valor, se copian. Si lo haces de<br>
la segunda manera, es cierto que la subrutina lo ve todo "aplanado" o<br>
"aplastado" a un solo array @_.<br>
<br>
¿Es eso problema? Si tú haces la subrutina y tú la usas, no. Para recuperar<br>
los valores dentro te basta con hacer:<br>
<br>
my $a = shift; # Extraigo un valor de @_, que es el $a de fuera<br>
my @b = @_; # Recupero el resto de valores de @_ de golpe.<br>
<br>
Si lo haces de la otra manera, como referencia, tendrás que hacer algo<br>
parecido:<br>
<br>
my ($a, $b) = @_;<br>
<br>
Pero ahora para usar $b, tendrás que desreferenciar cada vez, en plan @$b o<br>
$b->[0], que es feo de narices, y un tostón. :-)<br>
<br>
> use 5.010;<br>
> say "un abrazo!! " ;<br>
<br>
Argh, odio esto de Perl. :-)<br>
<br>
Tener que decir que uses una versión en concreto para poder usar un simple<br>
say()... Pero en caso de necesitarlo prefiero decir "use feature 'say';". Así<br>
queda claro que es lo que necesitas.<br>
<br>
--<br>
Alex (a.k.a. suy) | GPG ID 0x0B8B0BC2<br>
<a href="http://barnacity.net/" target="_blank">http://barnacity.net/</a> | <a href="http://disperso.net" target="_blank">http://disperso.net</a><br>
<br>
<br>
------------------------------<br>
<br>
Message: 2<br>
Date: Fri, 12 Apr 2013 06:38:05 +0200<br>
From: Gonzalo Pérez de Olaguer Córdoba  <<a href="mailto:gpoc@iies.es">gpoc@iies.es</a>><br>
To: <a href="mailto:barcelona-pm@pm.org">barcelona-pm@pm.org</a><br>
Subject: Re: [bcn-pm] Curso; dudas(regex, substr vs unpack,<br>
        subrutinas)<br>
Message-ID: <20130412063805.03ae1b16@petres.salonet.snet><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Hola Sergio González Rodríguez <<a href="mailto:sergiogoro86@gmail.com">sergiogoro86@gmail.com</a>><br>
el Thu, 11 Apr 2013 20:09:45 +0200 escribiste:<br>
<br>
> 2.1) substr vs unpack<br>
><br>
> En el Perl cookbok (cap.1 accessing substrings:<br>
> <a href="http://docstore.mik.ua/orelly/perl/cookbook/ch01_02.htm" target="_blank">http://docstore.mik.ua/orelly/perl/cookbook/ch01_02.htm</a> ) dice que podemos<br>
> usar unpack para extraer substrings más rapidamente que con substr.<br>
><br>
> Teniendo una $cadena = 'cadena de texto'<br>
> Podemos extraer el 'de' así:<br>
>     substr($cadena, 6, 3);<br>
>     o asi<br>
>     unpack("x7 A2", $cadena);<br>
><br>
> He mirado el perldoc de unpack(<br>
> <a href="http://perldoc.perl.org/functions/unpack.html" target="_blank">http://perldoc.perl.org/functions/unpack.html</a> ), y otro tutorial(<br>
> <a href="http://www.perlmonks.org/?node_id=557655" target="_blank">http://www.perlmonks.org/?node_id=557655</a> )<br>
> y no me queda nada claro "de qué va el unpack..." simplemente que es más<br>
> rápido que el substr porque lo dice el cookbook...<br>
><br>
> El debate sería: ¿Qué os parece usar el unpack como en este ejemplo frente<br>
> al substr? ¿Lo usáis? ¿Cuando y cuando no?<br>
<br>
substr trata la cadena como una lista de caracteres<br>
unpack trata la cadena como una lista de octetos<br>
<br>
Sólo son intercambiables si se utiliza un juego de caracteres que<br>
asigne un octeto a cada carácter. No serviría para utf8, por ejemplo.<br>
<br>
Yo no lo usaría nunca.<br>
<br>
> 2.2) Llamadas a subrutinas<br>
> marine();<br>
> o<br>
> &marine();<br>
><br>
> ¿simple cuestión de estilo o tiene alguna otra implicación?<br>
<br>
marine() llama a marine con cero argumentos<br>
<br>
&marine llama a marine pasándole los argumentos de la función<br>
donde se ejecuta la llamada, de forma que marine verá los mismos<br>
argumentos que dicha función. No es equivalente a marine (@_),<br>
pues en este último caso marine recibe una copia de @_, mientras que<br>
&marine realmente recibe (y puede modificar) los mismos<br>
argumentos que tiene la función donde se llama.<br>
<br>
&marine() es una cosa rara que equivale a marine()<br>
<br>
> 2.3)Expresiones regulares<br>
> Leyendo de un archivo con líneas que contienen lo siguiente:<br>
> FBtr123;blablabla<br>
> Y<br>
> FBtr123,FBtr567,FBtr120;blabla<br>
><br>
> Para almacenar estos match estoy haciendo:<br>
> push(@FBtr, $1) if ($line=~/(FBtr\d+);/ || $line=~/(FBtr\d+,.+);/ )<br>
> #guardar un match si sólo hay uno, y guardarlos todos si sólo<br>
> ¿Es esto lo mejor?<br>
<br>
Eso aceptaría, por ejemplo, "FBtr123,esto_no_me_lo_esperaba;blabla"<br>
<br>
> ¿o seria mejor así?<br>
> push(@FBtr, $1) if ($line=~/(FBtr\d+);||(FBtr\d+,.+);/ )<br>
<br>
push @FBtr, $1 if $line =~ m/^(FBtr\d+(,FBtr\d+)*);/;<br>
<br>
> *empecé a descubrir algo de los lookahead,  y pensé que podría<br>
> implementarlo para ver si hay 'un solo fbtr'  o 'más de uno' pero creo que<br>
> también eso sería liar el rizo innecesariamente ¿os parece?<br>
<br>
Un lookahead te pillaría FBtr123,FBtr123,FBtr123,... pero no una<br>
línea con FBtr que tuviesen distintos números.<br>
<br>
> 2.4) Paso de argumentos a subrutinas<br>
> Pasando por valor, la subrutina se hace una copia interna del argumento,<br>
> así que no podemos devolverlo fuera de la sub (o si lo devolvemos no será<br>
> el modificado dentro de la sub)<br>
> Pasando por referencia, la sub puede modificar dichos argumentos.<br>
> Pero, si quisiera pasar un array, aunque no quiera que lo modifique; ¿<br>
> Debería pasarlo referenciado, por que si no hará la ¿expansión?/flatten del<br>
> array ?<br>
> Es decir<br>
> $marine($a, \@b) #Bien?<br>
> &marine($a, @b) #Mal porque expande @b?<br>
<br>
Si la función llamada modifica localmente los argumentos querrás pasar<br>
el valor @b y no la referencia \@b, para que los cambios locales no afecten<br>
al array @b<br>
<br>
Si quieres que los cambios locales actúe sobre @b deberás pasar la referencia,<br>
a menos que hagas algo como esto: @b = marine ($a, @b);<br>
<br>
Si @b es grande pasar la referencia consumirá mucho menos tiempo<br>
y memoria que pasar por valor, pues en este último caso se está<br>
clonando el array.<br>
<br>
Saludos,<br>
Gonzalo.<br>
<br>
--<br>
Gonzalo Pérez de Olaguer Córdoba <<a href="mailto:gpoc@iies.es">gpoc@iies.es</a>> --- <a href="http://www.gpoc.es" target="_blank">www.gpoc.es</a><br>
PGP key 2861C704 --- F206 5671 6789 425D 111C  1302 214F 1934 2861 C704<br>
-------------- part següent --------------<br>
A non-text attachment was scrubbed...<br>
Name: signature.asc<br>
Type: application/pgp-signature<br>
Size: 190 bytes<br>
Desc: no disponible<br>
URL: <<a href="http://mail.pm.org/pipermail/barcelona-pm/attachments/20130412/9b2a8131/attachment-0001.bin" target="_blank">http://mail.pm.org/pipermail/barcelona-pm/attachments/20130412/9b2a8131/attachment-0001.bin</a>><br>

<br>
------------------------------<br>
<br>
Subject: Peu de pàgina del resum<br>
<br>
_______________________________________________<br>
llista dels Barcelona-pm<br>
<a href="mailto:Barcelona-pm@pm.org">Barcelona-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/barcelona-pm" target="_blank">http://mail.pm.org/mailman/listinfo/barcelona-pm</a><br>
BCN Perl Mongers: <a href="http://barcelona.pm.org" target="_blank">http://barcelona.pm.org</a><br>
<br>
------------------------------<br>
<br>
Final de Resum de Barcelona-pm, vol 117, número 6<br>
**************************************************<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Sergio González<br>Bioinformático && Biólogo marino<br><a href="http://about.me/sergiogoro" target="_blank">http://about.me/sergiogoro</a><br>
</div>
</div>