Supongamos que tenemos este código:
- Código: Seleccionar todo
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: Seleccionar todo
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: Seleccionar todo
5 my $num = "\n";
entonces sale esto:
- Código: Seleccionar todo
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: Seleccionar todo
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.