algo
en las siguientes expresiones?
$f = algo; @p = algo; ($w, $b) = algo; ($d) = algo; $f[3] = algo; 123 + algo; push @f, algo; algo + 456; foreach $f (algo) { ... } if (algo) { ... } sort algo while (algo) { ... } reverse algo; $f[algo] = algo;
@w = undef; $a = @w; print "$a\n";
my
no implica ningún contexto en particular.
Por ejemplo:
my ($num) = @_; # contexto de lista my $num = @_; # contexto escalar
¿Que valores quedan almacenados en $num
en cada caso?
¿Que es @a[1]
? ¿Un elemento de un array
o un trozo (slice) de un array
?
¿Que efecto tiene el siguiente código?:
@text = (1, 2, 3, 4, 5); @text[@text] = 0;¿En que contexto se interpreta el
array @text
que aparece dentro del corchete? ¿Escalar o
lista?
Respuesta:
El array text
entre corchetes es interpretado en un contexto de lista, pues no dice
$text[@text]
, dice @text[@text]
. El resultado es un trozo con 5 elementos.
Por tanto dice:
@text[(1, 2, 3, 4, 5)] = 0
.
Asi pues, text[0]
permanece no modificado y es 1, text[1]
es igualado a 0
y los restantes miembros quedan undef
ya que la parte derecha es una lista que contiene
un sólo elemento.
lhp@nereida:~/Lperl/src$ perl -wde 0 main::(-e:1): 0 DB<1> @text = (1, 2, 3, 4, 5) DB<2> @text[@text] = 0 DB<3> x @text 0 1 1 0 2 undef 3 undef 4 undef 5 undef DB<4> @text = (1, 2, 3, 4, 5) DB<5> $text[@text] = 0 DB<6> x @text 0 1 1 2 2 3 3 4 4 5 5 0
En un contexto de lista el operador <STDIN>
lee todas las líneas restantes en la entrada
y las almacena en una lista. Por ejemplo:
lhp@nereida:~/Lperl/src$ perl -wde 0 main::(-e:1): 0 DB<1> !!cat prueba1.txt 12 23 3 4 2 1 DB<2> open $f, 'prueba1.txt' DB<3> @x = <$f> DB<4> chomp(@x) DB<5> x @x[-3..-1] 0 4 1 2 2 1 DB<6> $/ = '3' DB<7> open $f, 'prueba1.txt' DB<8> @x = <$f> DB<9> chomp(@x) DB<10> x @x 0 '12 2' 1 ' ' 2 ' 4 2 1 'Leemos y almacenamos las líneas en el array
@x
. La orden chomp
Elimina todos los separadores de registro de todas las líneas en la lista.
3
en la salida de la línea 10?
Explique la interpretación que hace Perl del siguiente fragmento de código. Consulte 1.13.2 y el manual de Perl para entender el uso de la función grep. Lea el capítulo 3 para saber mas sobre expresiones regulares:
@a = grep /\bjose\b/, <>;
En la expresión regular \b
es un ancla: casa con una frontera (boundary)
de palabra. Asi pues, josefa
y quejose
no casan con /\bjose\b/
.