strawberry logo lane historia example compilador perl

logo - perl vs python



¿Qué significa $#array en Perl? (4)

Tenga en cuenta que la expresión $ # array devolverá -1 cuando array tenga cero elementos.

Estoy viendo el siguiente fragmento de código:

my @ret = <someMethod> return (undef) if( $DB_ERROR ); return (undef) unless ($#ret >= 0);

¿ $# Solo te da un conteo de elementos en una matriz?


edg es correcto, pero el código original es innecesariamente obtuso. En la mayoría de los casos, $#foo es una bandera roja que scalar @foo que el código se puede escribir de forma más simple con scalar @foo .

return (undef) unless ($#ret >= 0);

unless foo >= bar sea ​​difícil de descifrar. Primero, conviértalo en una declaración positiva.

return (undef) if ($#ret < 0);

¿Cuándo es $ # ret <0? Cuando es -1. Un $ # ret de -1 es una matriz de longitud 0. Entonces, lo anterior se puede escribir mucho más simplemente como ...

return (undef) if scalar @ret <= 0;

Pero no puedes tener una matriz de longitud negativa, así que ...

return (undef) if scalar @ret == 0;

Y == está en contexto escalar, por lo que "escalar" es redundante ...

return (undef) if @ret == 0;

Pero esa es solo una forma @ret de decir "si @ret es falso".

return (undef) if !@ret;

Lo cual creo que para los modificadores de enunciados simples se expresa mejor a menos.

return (undef) unless @ret;

¿No es más fácil de seguir?

Como última nota al return undef se desaconseja return undef porque hace lo incorrecto en el contexto de la lista. Obtiene una lista que contiene un elemento undef, que es verdadero. En su lugar, solo use un retorno en blanco que devuelve undef en contexto escalar y una lista vacía en contexto de lista.

return unless @ret;


Para resumir a todos los demás, ese código es mucho más legible si se escribe así:

my @ret = someMethod(); return if $DB_ERROR; return unless @ret;


$#arrayname le da el índice del último elemento, por lo que si array @ret tiene 2 elementos, $#ret es 1.

Y, como notó Barry Brown, una matriz vacía da -1.

Para obtener la longitud, puede usar la matriz en contexto escalar:

print scalar @ret;