2010-02-01 16 views
13

Questi sono quelli io sappia:Quali esempi di codice perl possono portare a comportamenti non definiti?

  1. Il comportamento di un "my" dichiarazione modificato con una dichiarazione modificatore condizionale o costrutto di ciclo (ad esempio "my $x if ...").
  2. Modifica di una variabile due volte nella stessa dichiarazione, come $i = $i++;
  3. sort() in un contesto scalare
  4. truncate(), quando la lunghezza è maggiore della lunghezza del file
  5. Utilizzando interi a 32 bit, "1 << 32" non è definito . Anche lo spostamento da un numero negativo di bit non è definito.
  6. Assegnazione non scalare alle variabili di "stato", ad es. state @a = (1..3).
+1

Questo dovrebbe essere wiki della comunità – Quentin

+3

Sono affascinato dal sapere perché qualcuno pensa che questa domanda debba essere chiusa. –

+0

Non è una domanda realmente rispondibile, in quanto si tratta di un comportamento non supportato e indefinito nelle specifiche Perl, nonché di eventuali bug che potrebbero essere in agguato. – Ether

risposta

3

Questi sono solo variazioni sul tema di modificare una struttura che viene iterato:

map, grep e sort dove il codice di riferimento modifica l'elenco degli elementi da ordinare.

Un altro problema con sort pone in cui il codice di riferimento non è idempotente (nel senso sci comp) - sort_func($a, $b) deve sempre restituire lo stesso valore per un dato $a e $b.

+1

Non ricordo più le circostanze, ma un tempo ho cercato di abusare di 'sort' facendogli passare un sestup non iden- tocente con risultati divertenti e bizzarri. –

3

Uno che è facile da inciampare è uscito prematuramente da un ciclo mentre itera attraverso un hash con 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"; 
} 

uscita:

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

Questo è ovviamente un esempio stupido, ma il punto si è fermato - quando iterazione attraverso un hash con each si deve o non last o return fuori dal giro; oppure è necessario reimpostare l'iteratore (con keys %hash) prima di ogni ricerca.

+0

Molto utile! Grazie! – snoofkin

Problemi correlati