Какие примеры кода на Perl могут привести к неопределенному поведению? - PullRequest
14 голосов
/ 01 февраля 2010

Это те, о которых я знаю:

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

Ответы [ 2 ]

5 голосов
/ 08 августа 2011

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

4 голосов
/ 02 февраля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...