• Publicidad

Manejo de variables

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Manejo de variables

Notapor caribesoft » 2007-11-13 10:35 @482

Hola amigos Perlianos:

Tengo un script por medio del cual construyo una "Lista desplegable", partiendo de un array, y cuando selecciono una opción de la lista y el valor consta de dos palabras se corta y solo me envía una.

¿Cómo puedo hacer para poder enviar la variable completa, si contiene dos o más palabras?

Para que me entiendan, este es parte del código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
###### Aqui utilizo un Javascript para hacer el envio #######
print"<tr><td align=right>Destination :</td>
        <td><select name='fieldname3' size='1' onChange='openDir3( this.form )'>
        if($seldes eq ''){
              $seldes = 'Acapulco';
        }
        print"
<option>$seldes</option>";
#####  Aqui contruyo la Lista desplegable  ######
        foreach $line (@array_res){
         print"
<option value=api_1.pl?tipores=$tipores&seldes=$line>$line</option>";
        }
print"
</select></td>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El problema es cuando la variable $line es igual a "Riviera Maya", solo me envía "Riviera", o si es "Los Cabos", solo me envía "Los"; cuando se compone de una sola palabra, por ejemplo "Acapulco", funciona bien.

¿Alguna pista para resolver este caso?

Como siempre, muchas gracias y saludos,

Caribesoft 8)
caribesoft
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2006-05-09 22:01 @959
Ubicación: Cancun

Publicidad

Notapor explorer » 2007-11-13 11:21 @515

Justo antes del print, pasa $line por esta expresión regular:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
($valor_linea = $line) =~ s/ /+/g;
print"<option value=api_1.pl?tipores=$tipores&seldes=$valor_linea>$line</option>";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Te queda como ejercicio explicar por qué.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

¡¡¡ Perfectamente !!!

Notapor caribesoft » 2007-11-13 11:45 @531

Gracias Explorer:

Efectivamente, utilizando esta línea, lo que hacemos es substituir los espacios en la variable $line, con el signo +, y con esto podemos leer una variable como si fuera una sola cadena de caracteres.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
($valor_linea = $line) =~ s/ /+/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo que hace realmente el signo + es unir el contenido de la variable y dejarla como una sola string.

¿Es correcto?

Saludos y muchas gracias.

Caribesoft 8)
caribesoft
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2006-05-09 22:01 @959
Ubicación: Cancun

Notapor explorer » 2007-11-13 11:57 @539

No...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Norther » 2007-11-13 12:30 @562

¿No reemplaza los espacios por '+' para que la URL tenga sentido? (O_o)

Search and replace

Search and replace is performed using s/regex/replacement/modifiers. The replacement is a Perl double quoted string that replaces in the string whatever is matched with the regex . The operator =~ is also used here to associate a string with s///. If matching against $_ , the $_ =~ can be dropped. If there is a match, s/// returns the number of substitutions made, otherwise it returns false. Here are a few examples:

$x = "Time to feed the cat!";
$x =~ s/cat/hacker/; # $x contains "Time to feed the hacker!"
$y = "'quoted words'";
$y =~ s/^'(.*)'$/$1/; # strip single quotes,
# $y contains "quoted words"

With the s/// operator, the matched variables $1 , $2 , etc. are immediately available for use in the replacement expression. With the global modifier, s///g will search and replace all occurrences of the regex in the string:

$x = "I batted 4 for 4";
$x =~ s/4/four/; # $x contains "I batted four for 4"
$x = "I batted 4 for 4";
$x =~ s/4/four/g; # $x contains "I batted four for four"
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-11-13 13:07 @588

¿Qué es eso de que "tenga sentido"? :-D

¿Para que citas Search and Replace? :-D
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Norther » 2007-11-13 13:12 @591

Ahora me haces dudar el por que :oops: jaja
Supongo que por que es la función que utilizaste, y sustituyes los ' ' espacios por el símbolo '+' para enviar una url completa, la diferencia entre:

Código: Seleccionar todo
http://www.google.es/search?hl=es&q=we+wa

y
Código: Seleccionar todo
http://www.google.es/search?hl=es&q=we wa


(¿no? :roll:)
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-11-13 13:14 @593

Si fuéramos estrictos, el print debería ser así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print qq{<option value="api_1.pl?tipores=$tipores&seldes=$valor_linea">$line</option>};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es decir, los valores de los atributos de las marcas HTML deben ir entrecomilladas. Por eso usamos qq{} para super-entre-comillar el texto que ya tiene comillas dentro.

Bueno, pues aún así, seguiría siendo necesario cambiar los espacios por '+' de la variable $valor_linea.

¿Por qué?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

¡Escape!

Notapor Jenda » 2007-11-17 10:50 @493

¡No es suficiente con cambiar los espacios! ¿Qué pasa si $line contiene & por ejemplo? ¿O <?

Deben usar algún módulo para escapar todo lo que necesita estar escapado, por ejemplo con CGI::Enurl y HTML::Entities.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use CGI::Enurl qw(enurl);
use HTML::Entities;

my $query = enurl {tipores => $tipores, seldes => $line};
print qq{<option value="api_1.pl?$query">} . encode_entities($line) . qq{</option>};
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Con Interpolation.pm se puede escribir sin esas variables y sin tener que cerrar y abrir el string:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use CGI::Enurl qw(enurl);
use HTML::Entities;

use Interpolation '?:@->$' => sub {'?' . enurl( {@_})};
use Interpolation 'HTML' => \&encode_entities;

# ...

print qq{<option value="api_1.pl$?{tipores => $tipores, seldes => $line}">$HTML{$line}</option>};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa


Volver a Intermedio

¿Quién está conectado?

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

cron