¿Por qué es esto en Perl:Perl substr (STRING, @ARRAY) ne substr (STRING, OFFSET, LENGTH)?
@x=(0,2);
substr('abcd',@x)
evaluados como "CD"?
Y esto:
substr('abcd',0,2);
evaluado como "ab"?
¿Por qué es esto en Perl:Perl substr (STRING, @ARRAY) ne substr (STRING, OFFSET, LENGTH)?
@x=(0,2);
substr('abcd',@x)
evaluados como "CD"?
Y esto:
substr('abcd',0,2);
evaluado como "ab"?
Los primeros usos @x
en contexto escalar ... es decir, el tamaño de @x
por lo substr('abcd',2)
da cd
.
substr tiene un prototipo como una función integrada, por lo que no se expande @x se evalúa en un contexto escalar, que devuelve 2, por lo que, básicamente, a la que llama substr ('ABCD', escalar (@x))
la sintaxis documentada del operador substr
es
substr EXPR,OFFSET,LENGTH,REPLACEMENT
substr EXPR,OFFSET,LENGTH
substr EXPR,OFFSET
no
substr EXPR,ARRAY
o el más genérico
substr EXPR,LIST
Esto se refleja en la salida de prototype
(aunque no siempre se puede confiar en esto).
$ perl -E'say prototype "CORE::substr"'
$$;$$
substr
's primero argumento se evalúa en contexto escalar.substr
El segundo argumento se evalúa en contexto escalar.substr
El tercer argumento (opcional) se evalúa en contexto escalar.substr
El 4 ° argumento (opcional) se evalúa en contexto escalar.@x
en contexto escalar es el número de elementos que contiene (2
en este caso).
Puede lograr lo que desee mediante los siguientes:
sub mysubstr {
if (@_ == 2) { substr($_[0], $_[1]) }
elsif (@_ == 3) { substr($_[0], $_[1], $_[2]) }
elsif (@_ == 4) { substr($_[0], $_[1], $_[2], $_[3]) }
else { die }
}
my @x = (0, 2);
mysubstr('abcd',@x)
1 He aprendido algo nuevo;) – Sorin
Gracias por las respuestas rápidas de iluminación – user1087245