Могу ли я перегрузить Perl =?(И проблема при использовании Tie)

StackOverflow https://stackoverflow.com/questions/1483418

Вопрос

Я решил использовать галстук и нашел это:

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{']'}}) {
}}
Это было полезно?

Решение

Это не ПРОСТО перегрузка операторов, но если вам абсолютно необходима эта функциональность, вы можете попробовать привязку Perl:http://perldoc.perl.org/functions/tie.html

Другие советы

Специальные символы для перегрузки перечисляет поведение перегрузки Perl для '='.

Значение «=" является ссылкой на функцию с тремя аргументами, т. е. оно выглядит как перегрузка других используемых значений.Однако он не перегружает оператор присваивания Perl.Это противоречило бы верблюжьей шерсти.

Поэтому вам, вероятно, придется переосмыслить свой подход.

Ты знаешь о Конфигурация::IniFiles?Вы можете подумать об этом, прежде чем уйти и изобрести это заново.При правильном создании подклассов вы можете добавить к нему порядок.

Кроме того, я думаю, что у вас неправильный интерфейс.Вы раскрываете внутреннюю структуру вашего объекта и изменяете ее с помощью магических назначений.Использование методов значительно облегчит вашу жизнь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top