Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Imprimir un string que contenga @

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Mie Jul 26, 2006 9:47 am
cyberalph
Perlero Nuevo
Perlero Nuevo
Registrado: 26 Jul 2006
Mensajes: 5
Imprimir un string que contenga @ Responder citando

Necesito ayuda con un script que genera un string que contiene la @ como carácter.
Leí por ahí que tenía que poner el \ para que me imprimiera la @, pero me lo está tomando como un retorno de carro y el string sale cortado en dos.
¿Que puedo hacer para imprimir la @?
Mensaje Mie Jul 26, 2006 10:27 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
Responder citando

Eso es muy raro lo que te pasa...

Con cualquier de estas cuatro formas se puede imprimir:

Código:
$frase = "El correo electrónico de ana es ana\@felix.nnet";
$frase = 'El correo electrónico de ana es ana@felix.nnet';
$frase = qq(El correo electrónico de ana es ana\@felix.nnet);
$frase = q(El correo electrónico de ana es ana@felix.nnet);
Mensaje Mie Jul 26, 2006 11:35 am
cyberalph
Perlero Nuevo
Perlero Nuevo
Registrado: 26 Jul 2006
Mensajes: 5
Responder citando

Pues cierto esta muy muy raro, probe las 4 opciones y el resultado fue el mismo.
Algo mas raro es que con la ultima opcion no se usa la \ pero me hace el retorno de carro. Si se imprime la @ pero se corta la linea.

Asi es como me lo imprime:
Channel: Sip/01XXXXXXXXXXX
@contexto-salida
...
...

Y esto es lo que necesito:
Channel: Sip/01XXXXXXXXXX@contexto-salida
...
...

Asi esta el codigo ahorita:

Código:

$sips=q(@fonet-outgoing);

sub create {
        open (FILETXT,">$pathtxt/$num") or die "Can't oppen $pathtxt/$num: $!";
        print FILETXT "Channel: Sip/01$num$sips\n";
                foreach $line (@FILE) {
                        print FILETXT "$line";
                }
        close (FILETXT);
}



Estaba pensando si esto no funciona, crear otra funcion para entrar al archivo y quitarle ese retorno de carro. El problema es que no se como posicionarme en la segunda linea (o ne la primera) y quitarle ese retorno de carro.
Question
Mensaje Mie Jul 26, 2006 12:13 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
Responder citando

¡Ah!, ¡pero es que el retorno de carro no está en $sips!
¡Está en $num!
Mensaje Mie Jul 26, 2006 1:03 pm
cyberalph
Perlero Nuevo
Perlero Nuevo
Registrado: 26 Jul 2006
Mensajes: 5
Responder citando

La variable $num la asigno de un listado de numeros que estan en un archivo como base de datos.
Pero no se como o de que forma esta poniendo ese retorno de carro.
Mensaje Mie Jul 26, 2006 1:12 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
Responder citando

Hazle un chomp($num) después de leerle...

Es posible que estés leyendo el retorno de carro al final de cada línea de ese archivo.
Mensaje Mie Jul 26, 2006 1:22 pm
cyberalph
Perlero Nuevo
Perlero Nuevo
Registrado: 26 Jul 2006
Mensajes: 5
Responder citando

De hecho asi lo estoy haciendo, este es el codigo donde lo hago:

Código:


foreach $num (@DB) {
        chomp($num);
        print "$i $num\n";
        &create;
}


estoy asignando lo de @DB; que es el archivo donde tengo los numeros, a la variable $num.

El archivo de los numeros no tiene formato son numeros de 10 caracteres:
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX

Mensaje Mie Jul 26, 2006 2:30 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
Responder citando

Supongamos que tenemos este código:
Código:
    1 #!/usr/bin/perl
    2 use warnings;
    3
    4 @DB = <DATA>;
    5 $num = "\n";
    6 $i = 0;
    7 $sips = q(@fonet-outgoing);
    8
    9 foreach $num ( @DB ) {
   10     chomp($num);
   11     print "$i $num\n";
   12     $i++;
   13     &create;
   14 }
   15
   16 sub create {
   17     print "Channel: Sip/01$num$sips\n";
   18 }
   19
   20 __DATA__
   21 123456789
   22 234567891
   23 345678912
   24 456789123
   25 567891234
Al ejecutarlo sale:
Código:
0 123456789
Channel: Sip/01123456789@fonet-outgoing
1 234567891
Channel: Sip/01234567891@fonet-outgoing
2 345678912
Channel: Sip/01345678912@fonet-outgoing
3 456789123
Channel: Sip/01456789123@fonet-outgoing
4 567891234
Channel: Sip/01567891234@fonet-outgoing
Así sí funciona, pero si declaramos a la variable $num como local:
Código:
    5 my $num = "\n";
entonces sale esto:
Código:
0 123456789
Channel: Sip/01
@fonet-outgoing
1 234567891
Channel: Sip/01
@fonet-outgoing
2 345678912
Channel: Sip/01
@fonet-outgoing
3 456789123
Channel: Sip/01
@fonet-outgoing
4 567891234
Channel: Sip/01
@fonet-outgoing
¿Por qué pasa esto si hemos definido a la variable $num en un ámbito global, al principio del programa?

La explicación está en el foreach. En ese momento, foreach está creando una nueva variable $num, independiente de la que hay en la línea 5. Le adjudicamos un valor y luego llamamos a la función create, pero la función sigue accediendo a la variable $num primera. No tiene ningún acceso a la variable $num creada dentro del foreach.

Esto no es exáctamente lo que te está pasando, pero podría formar parte del problema.

Una forma de arreglarlo:
Código:
    1 #!/usr/bin/perl
    2 use warnings;
    3
    4 @DB = <DATA>;
    5 $i = 0;
    6 $sips = q(@fonet-outgoing);
    7
    8 foreach $num ( @DB ) {
    9     chomp($num);
   10     print "$i $num\n";
   11     $i++;
   12     &create($num);
   13 }
   14
   15 sub create {
   16     $numero = $_[0];
   17     print "Channel: Sip/01$numero$sips\n";
   18 }
   19
   20 __DATA__
   21 123456789
   22 234567891
   23 345678912
   24 456789123
   25 567891234
Lo que hacemos es pasarle a la función create el valor de $num y dentro de ella la recogemos en la variable $numero. Así nos aseguramos que es el valor correcto el que estamos usando.
Mensaje Mie Jul 26, 2006 4:57 pm
cyberalph
Perlero Nuevo
Perlero Nuevo
Registrado: 26 Jul 2006
Mensajes: 5
Responder citando

Pues caso muy raro, probe las opciones que me diste y salio el mismo resultado. Mad
Logre resolverlo sacando un substring de la cadena de caracteres de $num.
Saque solo los 10 digitos y eso fue lo que imprimi Razz
Código:

foreach $num2 (@DB) {
        $otra=$num2;
        $otra2=substr($otra,0,10);
        $num=$otra2;
        print "$i $num\n";

        &create($num);
}


Gracias muchas Gracias por tu ayuda amigo.
Voy a seguir checando esta chunche tiene que jalar como estaba o con las opciones que me diste.

Saludos.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group