Все задачи

Города и острова

26 Jun 2013
Read this article in English: here.

У программиста есть модуль RegionsData, в котором хранятся полезные данные о географических регионах.

use strict;
use warnings;

package RegionsData;

our %REGIONS = (
    192 => {
        name => 'порт Хавнор',
        type => 6,
        parents => [ 0, 225, 3, 10658 ],
        childs => [  ],
    },
    10658 => {
        name => 'Хавнор',
        type => 5,
        parents => [ 0, 225, 3 ],
        childs => [ 10668, 192, 10664 ],
    },
    10668 => {
        name => 'Южный порт',
        type => 6,
        parents => [ 0, 225, 3, 10658 ],
        childs => [  ],
    },
    11450 => {
        name => 'Рок',
        type => 5,
        parents => [ 0, 225, 73 ],
        childs => [  ],
    },
    20538 => {
        name => 'Лорбанери',
        type => 5,
        parents => [ 0, 187, 20525 ],
        childs => [  ],
    },
    # ...
);

1;

Программисту понадобилось отфильтровать регионы по некоторому условию:

use strict;
use warnings;

use RegionsData;

my @leaf_islands;
for my $id (keys %RegionData::REGIONS){
    my $reg = $RegionData::REGIONS{$id};
    if( $reg->{type} == 5 && @{$reg->{childs}} == 0 ){
        push @leaf_islands, $reg->{name};
    }
}

print join ",", @leaf_islands; 

Увы! При выполнении нет никаких ворнингов, но список почему-то оказывается пустым.

Подсказка

Показать

В %REGIONS точно есть подходящие записи: Лорбанери, Рок

Подсказка-2

Показать

Ну, они точно есть в %RegionsData::REGIONS.

Разоблачение

Показать

В программе используется имя %RegionData::REGIONS, хотя подразумевается %RegionsData::REGIONS. Таблица имен RegionData:: (как и любая другая) доступна, даже если соответсвующий пакет не был загружен. А поскольку ошибочное имя используется в коде дважды, perl даже не выдает предупреждение Name used only once: possible typo.

На заметку: use strict и use warnings – сильное средство контроля, но даже с ними Perl остается гораздо более терпимым к ‘неопределенным’ идентификаторам, чем статически типизируемые компилиуемые языки. Так что присматривайте за своими именами сами.