Thread Schreibfehler in Label (14 answers)
Opened by barney at 2023-12-14 12:33

haj
 2023-12-14 19:55
#195668 #195668
User since
2015-01-07
551 Artikel
BenutzerIn

user image
Das Buch "Perl Best Practices" verlangt die Verwendung einer Marke, wenn eine Schleife explizit verlassen wird, da hätte ich vermutet, dass auch eine Policy existiert, ich habe aber keine gefunden. Sinnvoll wäre das, weil Perl bei Labels sehr ... dynamisch ist.

Labels müssen zum Beispiel nicht eindeutig sein. Sie werden auch in anderen Dateien/Packages angesprungen, wenn da eine übergeordnete Schleife das Label definiert. Es gibt immerhin eine Warnung, wenn dabei ein Unterprogramm oder eval verlassen werden. Außerdem erlaubt next seit Perl 5.18 auch Ausdrücke als Sprungziel.

Meine Konvention wäre: Labels sind in GROSSBUCHSTABEN zu schreiben und dürfen nur da angesprungen werden, wo sie auch lexikalisch definiert wären. Das könnte man dann auch statisch in einer Perl::Critic Policy prüfen.

Ich habe mal ein bisschen mit CPAN:PPI rumgespielt. Die Definition eines Label ist als CPAN:PPI::Token::Label erkennbar, damit lässt sich ein Inventar der "erlaubten" Sprungziele für jeden Scope verwalten.

Ein next oder redo ist erkennbar als CPAN:PPI::Statement::Break, aber was danach kommt, ist in den folgenden Fällen immer ein CPAN:PPI::Token::Word:
  • next LABEL; # ein Label
  • next if $i % 2; # kein Label, sondern ein postfix-if
  • next time; # Das Label wäre der Rückgabewert der Builtin-Funktion
  • next __PACKAGE__; # bei Top-Level-Packages geht das sogar

Da muss man also genau hinschauen: Perl "erlaubt" all das, meine Konvention nur die erste Variante und auch nur, wenn ein passendes PPI::Token::Label im "Scope" ist.

View full thread Schreibfehler in Label