У программиста есть модуль 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
точно есть подходящие записи: Лорбанери, Рок
Ну, они точно есть в %RegionsData::REGIONS
.
В программе используется имя %RegionData::REGIONS
,
хотя подразумевается %RegionsData::REGIONS
.
Таблица имен RegionData::
(как и любая другая) доступна,
даже если соответсвующий пакет не был загружен.
А поскольку ошибочное имя используется в коде
дважды, perl даже не выдает предупреждение Name used only once: possible typo
.
На заметку:
use strict
и use warnings
– сильное средство контроля,
но даже с ними Perl остается гораздо более терпимым к ‘неопределенным’ идентификаторам,
чем статически типизируемые компилиуемые языки.
Так что присматривайте за своими именами сами.