• Publicidad

Problema tonto con comillas

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema tonto con comillas

Notapor Eowyn » 2013-05-02 04:29 @228

Hola, aquí paro de nuevo.

Tengo una parte de código que quiero convertir en subprograma, es ésta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         my $ADI = 0;
  2.         my @array = ('"wid="w1"', 'wid="w2"');
  3.         my $lerroADI= 'wid="w1"';
  4.         for my $ADIa (@array) {
  5.                 if ($lerroADI eq $ADIa) {
  6.  
  7.                         $ADI=1;
  8.                 last;
  9.                 }
  10.         }
  11.         print "$ADI";
  12.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Lo primero es que no me devuelve nunca "1", siempre "0", aunque como se puede ver en el array sí que está wid="w1".

La otra y no por ello menos importante, es que no sé qué hacer con las comillas simples. Quiero convertir ese cacho en un subprograma que haga algo así:

1.- Recibir una línea de archivo por parámetro (lo que en el código de arriba sería $lerroADI

2.- Comparar esa línea con lo que hay dentro del array que le corresponde para ver si esa línea existe en el vector(me da igual dónde, sólo que esté es importante)

3.- Si está devuelve 1; si no está devuelve 0.

El caso es que en el primer paso, el parámetro que recibiría es algo así: <term tid="t549" type="open" lemma="itxi" pos="V.ADI-SIN">

Pero si esa línea no está entre 'comillas simples' no me la interpreta bien. Por tanto, mis preguntas son dos: ¿por qué siempre devuelve 0? y ¿cómo hago para guardar la línea que recibo como parámetro en una variable y que la interprete como si estuviera entrecomillada?

Muchas gracias :roll:
Eowyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 45
Registrado: 2011-06-04 08:51 @410

Publicidad

Re: Problema tonto con comillas

Notapor explorer » 2013-05-02 05:03 @252

Es normal que devuelva 0... $ADIa vale "wid="w1" y no wid="w1" (observa que sobran las " del principio) :)

Para hacer la comparación que quieres, puedes usar un grep{}:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (grep { $lerroADI eq $_ } @array) {
  2.     ...;
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


También puedes usar alguno de los módulos List::*, como por ejemplo List::AllUtils:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use List::AllUtils qw(any);
  2. ...;
  3. if (any {$lerroADI eq $_} @array) {
  4.     ...;
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En cuanto a las comillas... las reglas son sencillas: si entrecomillas con comillas simples, lo que pongas dentro será literal. Si lo haces con comillas dobles, será interpretado (variables y demás). Si tienes que entrecomillar cosas que tengan comillas dobles, usa simples. Si son simples, usa dobles :) En caso de duda, usa q() para el entrecomillado simple y qq() para el entrecomillado doble. Excepciones a estas reglas: la presencia de una comilla de igual signo que las comillas delimitadoras. En ese caso, se puede poner un escape '\' delante de ella. Aunque en este caso... es siempre mejor usar q() o qq().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema tonto con comillas

Notapor Eowyn » 2013-06-04 03:03 @169

Hola, comprendo lo que me explica, pero mi problema con las comillas es otro.

Si yo meto un archivo por teclado, leo la primera línea y esa línea la guardo en una variable, la línea no me la guarda entre comillas, me la guarda tal y como viene y por tanto no me la interpreta.

Así, no puedo pasar esa línea para que la compare directamente con el array, tendría que hacer un paso intermedio para que tal y como llega se guarde en la variable entre comilas simples, para que así al usar esa variable en la interpretación, pueda se interpretada.

No sé si me explico bien...
Eowyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 45
Registrado: 2011-06-04 08:51 @410

Re: Problema tonto con comillas

Notapor explorer » 2013-06-04 04:04 @211

Eowyn escribiste:Hola, comprendo lo que me explica, pero mi problema con las comillas es otro.

Si yo meto un archivo por teclado, leo la primera línea y esa línea la guardo en una variable, la línea no me la guarda entre comillas, me la guarda tal y como viene y por tanto no me la interpreta.
Eso es lógico: Perl guarda lo que lee. No sabe que tiene que hacer algo extra si no se lo decimos.

Eowyn escribiste:Así, no puedo pasar esa línea para que la compare directamente con el array, tendría que hacer un paso intermedio para que tal y como llega se guarde en la variable entre comilas simples, para que así al usar esa variable en la interpretación, pueda ser interpretada.
Ya me perdí...

¿Puedes poner un ejemplo?

Edito: Supongamos que recibimos esta línea desde el archivo:

<term tid="t549" type="open" lemma="itxi" pos="V.ADI-SIN">

Entonces es eso justo lo que guardamos en la variable:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $linea = '<term tid="t549" type="open" lemma="itxi" pos="V.ADI-SIN">';   # pongo comillas simples, porque es una cadena literal
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

a partir de ahí puedo comparar o buscar por partes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($linea eq '<term tid="t549" type="open" lemma="itxi" pos="V.ADI-SIN">') {
  2.     say "Son iguales";
  3. }
  4.  
  5. if ($linea =~ /lemma="itxi"/) {
  6.     say "Contiene el lema [itxi]";
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema tonto con comillas

Notapor Eowyn » 2013-06-04 05:25 @267

La verdad es que es difícil de explicar... :oops: El problema aparece entre recibir la línea del archivo y que la variable la recoja. Es decir:

Leo del archivo una línea con la siguiente forma:

<Hola, espero que "todo" vaya bien!>

La quiero guardar en la variable $línea, así que haría algo así:

$línea=<leer primera línea del archivo>

Entonces si hiciera print $línea vería que tengo en realidad esto

$línea= Hola, espero que "todo" vaya bien!

Como Hola, espero que "todo" vaya bien! no entra a $linea entrecomillado, como bien señalas, no puedo usar $linea para comparar con lo que hay dentro del array, porque lógicamente no lo entiende ya que recibe Hola, espero que "todo" vaya bien! en lugar de recibir 'Hola, espero que "todo" vaya bien!'

Tengo que hacer esa comparación con miles de líneas del archivo.
Eowyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 45
Registrado: 2011-06-04 08:51 @410

Re: Problema tonto con comillas

Notapor explorer » 2013-06-04 06:44 @322

¡Vaya lío te has hecho!

Las comillas que usas en Perl, como delimitadores de cadenas de caracteres, nunca pertenecen al contenido que delimitan.

Si usamos las comillas es para delimitar una zona del programa como una serie de caracteres literales.

Cuando leemos algo desde un archivo, la línea se lee tal cual del archivo, sin modificaciones (exceptuando si está activa una capa de PerlIO).

Entonces solo queda hacer una simple comparación...
Código: Seleccionar todo
> cat kk.txt
<Hola, espero que "todo" vaya bien!>

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.10;
  3. use autodie;
  4.  
  5. my $ADI;
  6. my @array = (
  7.     '<Hola, espero que "todo" vaya bien!>',             # En el array se guarda esa cadena de caracteres
  8. );
  9.  
  10. open my $ARCHIVO, '<', 'kk.txt';
  11.  
  12. while (my $lerroADI = <$ARCHIVO>) {
  13.     chomp $lerroADI;
  14.  
  15.     for my $ADIa (@array) {
  16.         if ($lerroADI eq $ADIa) {
  17.             $ADI = 1;
  18.             last;
  19.         }
  20.     }
  21. }
  22.  
  23. if ($ADI) {
  24.     say "Encontrado en la línea $.";
  25. }
  26.  
  27. close $ARCHIVO;
  28.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema tonto con comillas

Notapor Eowyn » 2013-06-11 05:18 @263

Sííííí, efectivamente me he hecho un lío, pero ya va mucho mejor. Sólo me da lo de "not a glob reference" que voy a investigarlo por el foro para no darte más trabajo.

Muchas gracias. Por Navidad debería enviarte un jamón o algo así :roll: :mrgreen:
Eowyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 45
Registrado: 2011-06-04 08:51 @410

Re: Problema tonto con comillas

Notapor explorer » 2013-06-11 06:36 @317

Eowyn escribiste:Por Navidad debería enviarte un jamón o algo así :roll: :mrgreen:
Si me encuentras un puesto de trabajo, el jamón te lo envío yo ;)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema tonto con comillas

Notapor Eowyn » 2013-07-10 04:33 @231

Bueno, en Valladolid no parece haber mucho, pero si miras en opcionempleo.com ¡hay varios puestos para Perl en Barcelona! De lo malo, malo, puedes hacerte autónomo y ayudar previo pago a gente incapaz de acabar su proyecto de fin de carrera (como yo, por ejemplo :oops: ) ¡Ánimo!
Eowyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 45
Registrado: 2011-06-04 08:51 @410


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 11 invitados