Какие образцы кода perl могут привести к поведению undefined?

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

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

Ответ 1

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

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

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

Ответ 2

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