2010-02-01 8 views
13

Dies sind diejenigen mir bekannt:Welche Perl-Code-Beispiele können zu undefiniertem Verhalten führen?

  1. Das Verhalten eines „my“ Anweisung mit einer bedingten Anweisung Modifikator modifiziert oder Schleifenkonstrukt (z.B. „my $x if ...“).
  2. eine Variable zweimal in derselben Anweisung ändern, wie $i = $i++;
  3. sort() in Skalarkontext
  4. truncate(), wenn Länge größer ist als die Länge der Datei
  5. Mit Hilfe von 32-Bit-Integer "1 << 32" ist nicht definiert . Das Verschieben um eine negative Anzahl von Bits ist ebenfalls undefiniert.
  6. Nicht-skalare Zuweisung zu "Status" -Variablen, z. state @a = (1..3).
+1

Dies sollte Gemeinschaft Wiki sein – Quentin

+3

Ich bin fasziniert zu wissen, warum jemand denkt, diese Frage sollte geschlossen werden. –

+0

Es handelt sich nicht wirklich um eine zu beantwortende Frage, da hier nach einem nicht unterstützten und undefinierten Verhalten in der Perl-Spezifikation gefragt wird, sowie nach Bugs, die möglicherweise lauern. – Ether

Antwort

3

Dies sind nur Variationen über das Thema eine Struktur ändern, die iteriert wird:

map, grep und sort, wo der Code Referenz die Liste der Elemente zu sortieren ändert.

Ein weiteres Problem mit sort entsteht, wenn die Referenz-Code nicht (in dem comp sci Sinne) idempotent ist - sort_func($a, $b) muss immer den gleichen Wert für jeden gegebenen $a und $b zurückzukehren.

+1

Ich kann mich nicht mehr an die Umstände erinnern, aber auf einmal habe ich versucht, 'sort' zu missbrauchen, indem ich eine nicht-idempotente Sortsub mit amüsant bizarren Ergebnissen übertrug. –

3

Einer, der leicht zu stolpern ist, bricht vorzeitig aus einer Schleife während der Iteration durch einen Hash mit each.

#!/usr/bin/perl 

use strict; 
use warnings; 

my %name_to_num = (one => 1, two => 2, three => 3); 

find_name(2); # works the first time 
find_name(2); # but fails this time 

exit; 

sub find_name { 
    my($target) = @_; 

    while(my($name, $num) = each %name_to_num) { 
     if($num == $target) { 
      print "The number $target is called '$name'\n"; 
      return; 
     } 
    } 
    print "Unable to find a name for $target\n"; 
} 

Ausgang:

The number 2 is called 'two' 
Unable to find a name for 2 

Das ist natürlich ein dummes Beispiel, aber der Punkt steht noch - wenn sie mit each durch eine Hash-Iteration sollten Sie entweder nie last oder return aus der Schleife; oder Sie sollten den Iterator (mit keys %hash) vor jeder Suche zurücksetzen.

+0

Sehr nützlich! Vielen Dank! – snoofkin

Verwandte Themen