Pergunta

Eu escolho tie uso e encontrar este:

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]}->{'='};
}

se eu remover o último "$ [0] -> {$ [1]} -> { '='};", ele não funciona corretamente. Por quê?

Eu sei que um valor de retorno é necessário. Mas "$ [0] -> {$ [1]};" não pode funcionar corretamente, quer, e $ [0] -> {$ [1]} -.> { '='} não é a coisa toda


Post antigo:

Estou escrever um pacote em Perl para analisar arquivos INI. Apenas algo baseado em Config::Tiny .

Eu quero manter a ordem das seções e chaves, então eu uso conjunto extra para armazenar a ordem.

Mas quando eu uso "$Config->{newsection} = { this => 'that' }; # Add a section", eu preciso sobrecarga '=' para que "newsection" e "isto" pode ser empurrado na matriz.

Isso é possível para tornar o trabalho "$Config->{newsection} = { this => 'that' };" sem influenciar outras partes?

Uma parte do código é:

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{']'}}) {
}}
Foi útil?

Solução

Este não é exatamente APENAS sobrecarga de operadores, mas se você realmente precisa dessa funcionalidade, você pode tentar um laço perl: http://perldoc.perl.org/functions/tie.html

Outras dicas

símbolos especiais para a sobrecarga listas do comportamento de Perl sobrecarga de '='.

O valor para "=" é uma referência a uma função com três argumentos, ou seja, parece que os outros valores em sobrecarga de uso. No entanto, ele não sobrecarregar o operador de atribuição Perl. Isso iria contra cabelo Camel.

Então você provavelmente terá que repensar a sua abordagem.

Você sabe sobre Config :: IniFiles ? Você pode considerar que, antes de sair e reinventá-lo. Com algumas subclasses adequada, você pode adicionar ordenação a ele.

Além disso, eu acho que você tem a interface errada. Você está expondo a estrutura interna do seu objeto e modificá-lo através de trabalhos mágicos. Usando métodos iria tornar sua vida muito mais fácil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top