Domanda

Ho scelto di usare cravatta e trovare questo:

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 rimuovere l'ultimo "$ [0] -> {$ [1]} -> { '='};", non funziona correttamente. Perché?

So che è necessario un valore di ritorno. Ma "$ [0] -> {$ [1]};" non può funzionare correttamente o, e $ [0] -> {$ [1]} -.> { '='} non è il tutto


Vecchio post:

Sono scrivere un pacchetto in Perl per analizzare file INI. Solo qualcosa sulla base di Config::Tiny .

Voglio mantenere l'ordine delle sezioni e chiavi, in modo da utilizzare la matrice extra per memorizzare l'ordine.

Ma quando uso "$Config->{newsection} = { this => 'that' }; # Add a section", ho bisogno di sovraccaricare '=' in modo che "newsection" e "questo" può essere spinto nella matrice.

Questo è possibile fare "$Config->{newsection} = { this => 'that' };" lavoro senza influenzare altre parti?

Una parte del codice è:

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{']'}}) {
}}
È stato utile?

Soluzione

Questo non è esattamente SOLO overloading degli operatori, ma se avete assolutamente bisogno di questa funzionalità, si può provare un pareggio perl: http://perldoc.perl.org/functions/tie.html

Altri suggerimenti

simboli speciali per sovraccarico elenca il comportamento di Perl sovraccarico per '='.

  

Il valore di "=" è un riferimento a una funzione con tre argomenti, cioè, sembra che gli altri valori in uso sovraccarico. Tuttavia, non sovraccaricare l'operatore di assegnazione Perl. Ciò andrebbe contro i capelli cammello.

Quindi, si avrà probabilmente bisogno di ripensare il suo approccio.

Sai di Config :: IniFiles ? Si potrebbe considerare che prima di andare via e reinventarlo. Con un po 'corretta sottoclassi, è possibile aggiungere l'ordinazione ad esso.

Inoltre, penso che tu abbia l'interfaccia sbagliata. Si sta esponendo la struttura interna del vostro oggetto e modificando attraverso assegnazioni magici. Utilizzando metodi renderebbe la vita molto più facile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top