Как уже объяснил Евгений, эти строки манипулируют таблицей символов.С практической точки зрения, они делают это для того, чтобы создавать методы доступа только для чтения в классе на основе любого произвольного списка атрибутов, передаваемых в конструктор:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.10.0;
package SomeClass;
sub new {
my $pkg = shift;
my $args = shift;
my @keys = keys %$args;
my $self = bless \%{$args}, $pkg;
$self->{'__properties'} = \@keys;
my $class = ref($self);
foreach my $meth (@keys) {
if (!$self->can($meth)) {
no strict "refs";
*{$class . "::" . $meth} = sub {
my $instance = shift;
return $instance->{$meth};
};
}
}
return $self;
}
package main;
my $foo = SomeClass->new({foo => 5}); # Creates SomeClass::foo
say $foo->foo; # 5
my $bar = SomeClass->new({foo => 3, bar => 7}); # Creates SomeClass::bar
say $bar->foo; # 3
say $bar->bar; # 7
say $foo->bar; # undef - ::bar was added to all instances of SomeClass
say $foo->baz; # Boom! No such method.
Лично я думаю, что это сомнительная практика ОО(класс должен обычно иметь известный набор атрибутов, а не добавлять новые каждый раз при создании экземпляра), но это то, что он делает ...