Могу ли я перегрузить Perl's? (И проблема при использовании Tie)
Я решил использовать галстук и найти это:
package Galaxy::IO::INI;
sub new {
my $invocant = shift;
my $class = ref($invocant) || $invocant;
my $self = {']' => []}; # ini section can never be ']'
tie %{$self},'INIHash';
return bless $self, $class;
}
package INIHash;
use Carp;
require Tie::Hash;
@INIHash::ISA = qw(Tie::StdHash);
sub STORE {
#$_[0]->{$_[1]} = $_[2];
push @{$_[0]->{']'}},$_[1] unless exists $_[0]->{$_[1]};
for (keys %{$_[2]}) {
next if $_ eq '=';
push @{$_[0]->{$_[1]}->{'='}},$_ unless exists $_[0]->{$_[1]}->{$_};
$_[0]->{$_[1]}->{$_}=$_[2]->{$_};
}
$_[0]->{$_[1]}->{'='};
}
если я удалю последний "$[0] -> {$[1]} -> {'='};", он не будет работать правильно. Зачем?
Я знаю, что возвращаемое значение не требуется. Но "$[0] -> {$[1]};" также не может работать правильно, и $[0] -> {$[1]} -> {'='} - это еще не все.
Старый пост:
Я пишу пакет в Perl для анализа файлов INI. Просто что-то на основеConfig::Tiny
,
Я хочу сохранить порядок разделов и ключей, поэтому я использую дополнительный массив для хранения порядка.
Но когда я использую $Config->{newsection} = { this => 'that' }; # Add a section
"Мне нужно перегрузить"=
'так что "newsection" и "this" могут быть помещены в массив.
Можно ли это сделать?$Config->{newsection} = { this => 'that' };
работа без влияния других частей?
Часть кода:
sub new {
my $invocant = shift;
my $class = ref($invocant) || $invocant;
my $self = {']' => []}; # ini section can never be ']'
return bless $self, $class;
}
sub read_string {
if ( /^\s*\[\s*(.+?)\s*\]\s*$/ ) {
$self->{$ns = $1} ||= {'=' => []}; # ini key can never be '='
push @{$$self{']'}},$ns;
next;
}
if ( /^\s*([^=]+?)\s*=\s*(.*?)\s*$/ ) {
push @{$$self{$ns}{'='}},$1 unless defined $$self{$ns}{$1};
$self->{$ns}->{$1} = $2;
next;
}
}
sub write_string {
my $self = shift;
my $contents = '';
foreach my $section (@{$$self{']'}}) {
}}
3 ответа
Это не совсем перегрузка оператора JUST, но если вам абсолютно необходимы эти функции, вы можете попробовать Perl Tie: http://perldoc.perl.org/functions/tie.html
Специальные символы для перегрузки перечисляют поведение перегрузки Perl для '='.
Значение для "=" является ссылкой на функцию с тремя аргументами, т. Е. Похоже на другие значения, используемые при перегрузке. Однако он не перегружает оператор присваивания Perl. Это пошло бы против волос верблюда.
Таким образом, вам, вероятно, придется пересмотреть свой подход.
Знаете ли вы о Config:: IniFiles? Вы можете подумать об этом, прежде чем уйти и заново его изобрести. С некоторыми правильными подклассами вы можете добавить к нему порядок.
Кроме того, я думаю, что у вас не тот интерфейс. Вы выставляете внутреннюю структуру вашего объекта и изменяете его с помощью магических заданий. Использование методов сделает вашу жизнь намного проще.