strawberry logo lane historia example compilador perl

logo - ¿Cuáles son los equivalentes de Perl de retorno y continuar las palabras clave en C?



perl vs python (3)

Recibo este error cuando uso este código

sub search { my ($a, @a_list) = @_; foreach (@a_list) { if($_ == $a) return TRUE; # continue; } return FALSE; }

error de sintaxis en code.pl línea 26, cerca de ") return"

  • ¿Cuál es la forma correcta de return TRUE ?
  • Además, ¿cuál es la forma correcta de continue ?

Sé que debería pensar más en términos de Perl que intentar convertir el código C a Perl de esta manera.


Equivalentes de retorno, continuar, romper.

  • return es el equivalente al retorno.
  • next es el equivalente de continuar.
  • last es el equivalente de descanso.

Las declaraciones ''if'' están seguidas de bloques

Su problema es que una instrucción if siempre va seguida de un bloque entre llaves.

if ($_ == $a) { return TRUE; } elsif (...) { ... } else { ... }

A pesar de que a veces parece un poco detallado, estoy de acuerdo con ysth que esto es algo que Perl hizo bien. Para una alternativa interesante, vea el lenguaje de programación Go , que trata los paréntesis como innecesarios y ordena las llaves.

''if'' puede ser usado como un calificador

O puede usar el if como un modificador de declaración:

return TRUE if $_ == $a;

Tenga en cuenta que en este caso, no tiene que usar paréntesis alrededor de la expresión condicional, aunque no habrá ningún daño en agregarlos.

Usando ''a menos que''

También se puede usar a unless lugar de invertir la condición:

return TRUE unless $_ != $a;

(Y, como señaló Phillip Potter , mezclar a unless con una condición negada dificulta la comprensión; el ejemplo está haciendo directamente lo mismo que la pregunta, pero está mejor escrito como un if con igualdad).

Usando ''next'' y ''last''

Puedes usar next y last similarmente:

sub search { my ($a, @a_list) = @_; foreach (@a_list) { return TRUE if $_ == $a; last if $_ > $a; next if $ptom != LAST_QUARTER; ... } return FALSE; }

Tenga en cuenta la corrección en el bucle foreach . ( Se modificó la pregunta para incluir la reparación ) . Asegúrese de tener siempre '' use strict; ''y'' use warnings; ''en la parte superior de su guión. Los expertos siempre los usan para asegurarse de que no hayan cometido errores. Los principiantes deben usarlos exactamente por la misma razón.

Verdadero y falso

Además, como se señaló primero en otras respuestas, Perl no tiene constantes predefinidas VERDADERO y FALSO, como tampoco lo hace C o C ++ (C ++ tiene un true y false incorporado; C99 tiene true y false condicionalmente disponible si usted #include <stdbool.h> ). Puede proporcionar las definiciones para Perl como:

use constant TRUE => 1; use constant FALSE => 0;

Sin embargo, ten cuidado. Algunas cosas serán ''verdaderas'' incluso cuando no sean iguales a VERDADERO; otras cosas serán ''falsas'' incluso cuando no sean iguales a FALSO.

Discusión sobre el uso de ''$ a'' y ''$ b''

Los comentarios contienen una discusión acerca de no usar $a y $b como variables. En secuencia, los comentarios relevantes fueron:

  • Por favor, evite usar $ a menos que esté en un bloque de clasificación. - Zaid

  • @Zaid: Buen punto de que $ a y $ b son especiales en el contexto de un bloque de clasificación. No estoy seguro de si hay edictos que nunca deban usarse de otra forma; sería atroz usarlos cuando también hay un bloque de ordenación al acecho, pero en ausencia de bloques de tipo, no veo ninguna razón para Tratar $ a y diferente a $ z. - Jonathan Leffler

  • $ a y $ b son globales, y como tales se comportan de manera diferente a los léxicos. - phaylon

  • @phaylon: bueno, estrictamente son ''paquetes globales'' (ver Perl sort ). Sí, cuando estás clasificando, son diferentes de las variables léxicas (my). Cuando no está haciendo una clasificación, entonces pueden ser tratados como léxicos si los declara explícitamente. - Jonathan Leffler

  • @Jonathan Leffler, también están exentos de usar qw (vars) estricto; por lo que es posible que no se dé cuenta de que los está pisoteando desde otro ámbito. - Ven''Tatsu

Señalando lo obvio: solo usé $a porque la pregunta lo hizo, y en lugar de inundar el póster original con muchos detalles, me mantuve en su mayor parte en los puntos principales. Por ejemplo, la discusión de la last y la next no menciona las etiquetas de bucle.

Dicho esto, el consejo de "evitar el uso de $a y $b como variables" es acertado; son nombres especiales por las razones señaladas, y su uso deja abierta la posibilidad de errores que pueden o no ser detectables.


Jonathan respondió a su pregunta (¡muy!) De manera integral, pero quería señalar algunas otras formas más sencillas de reemplazar su función de "búsqueda".

use strict; use warnings; use 5.010; my @a_list = (1, 2, 3); my $a = 2; # If you''re using 5.10 or higher, you can use smart matching. # Note that this is only equivalent if $a is a number. # That is, "2.0" ~~ ["1", "2", "3"] is false. say $a ~~ @a_list; # Need to install List::MoreUtils, not a standard module use List::MoreUtils qw(any); say any { $a == $_ } @a_list; # List::Util is a core module use List::Util qw(first); say defined first { $a == $_ } @a_list; # No modules used, but less efficient say grep { $a == $_ } @a_list > 0;

Para obtener más información, consulte la documentación de coincidencia inteligente , List::MoreUtils , List::Util y grep .


Perl no ha construido constantes para verdadero y falso. El valor canónico para verdadero es 1 y para falso es () (que es una lista vacía en el contexto de la lista y undef en el contexto escalar).

Una forma más idomática de escribir su código sería:

sub search { my $key = shift; foreach (@_) { return 1 if $_ == $key; } return (); }