2010-02-01 3 views
13

Это те, я в курсе:Какие образцы кода perl могут привести к неопределенному поведению?

  1. поведения «my» заявления, модифицированном с помощью модификатора утверждения условной или петлевой конструкции (например, «my $x if ...»).
  2. Изменение переменной дважды в том же заявлении, как $i = $i++;
  3. sort() в скалярном контексте
  4. truncate(), когда длина больше, чем длина файла
  5. Использование 32-битных целых чисел, «1 << 32» не определен , Смещение отрицательным числом бит также не определено.
  6. Нескалярное присвоение «состояния» переменных, например. state @a = (1..3).
+1

Это должно быть сообщество wiki – Quentin

+3

Мне очень приятно узнать, почему кто-то считает, что этот вопрос должен быть закрыт. –

+0

На самом деле это не вопрос ответственности, поскольку он задает вопрос о неподдерживаемом и неопределенном поведении в спецификации Perl, а также о любых ошибках, которые могут скрываться. – Ether

ответ

3

Это просто вариации на тему изменения структуры, которая в настоящее время итерации:

map, grep и sort где контрольный код изменяет список элементов для сортировки.

Еще одна проблема с sort возникает тогда, когда код ссылки не идемпотентна (в смысле научной оценочного) - sort_func($a, $b) всегда должны возвращать одинаковое значение для любого заданного $a и $b.

+1

Я больше не помню обстоятельств, но когда-то я пытался злоупотреблять «сортировкой», передавая ему не-idempotent sortsub с забавными причудливыми результатами. –

3

То, что легко отключить, преждевременно вырывается из цикла, итерации через хэш с 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"; 
} 

Выход:

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

Это явно глупый пример, но дело до сих пор стоит - при переборе хэш с each вы должны либо никогда last или return из цикла; или вы должны сбросить итератор (с keys %hash) перед каждым поиском.

+0

Очень полезно! благодаря! – snoofkin

Смежные вопросы