Frage

ich wählen Bindung zu verwenden und finden diese:

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

wenn ich die letzten entfernen "$ [0] -> {$ [1]} -> { '='};", es funktioniert nicht richtig. Warum?

Ich weiß, dass ein Rückgabewert erforderlich ist. Aber "$ [0] -> {$ [1]};" kann nicht richtig entweder arbeiten und $ [0] -> {$ [1]}. -> { '='} ist nicht die ganze Sache


Alte Post:

Ich bin ein Paket in Perl für das Parsen von INI-Dateien schreiben. Nur etwas, basierend auf Config::Tiny .

Ich mag die Reihenfolge der Abschnitte und Schlüssel halten, so dass ich zusätzliche Array um den Auftrag zu speichern.

Aber wenn ich „$Config->{newsection} = { this => 'that' }; # Add a section“ verwenden, muss ich ‚=‘ zu überlasten, so dass „newsection“ und „das“ in der Reihe geschoben werden.

Ist das möglich „$Config->{newsection} = { this => 'that' };“ Arbeit ohne Einfluss anderer Teile zu machen?

Ein Teil des Codes ist:

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{']'}}) {
}}
War es hilfreich?

Lösung

Dies ist nicht gerade GERADE Überladen von Operatoren, aber wenn Sie unbedingt diese Funktion benötigen, können Sie eine Perl-Bindung versuchen: http://perldoc.perl.org/functions/tie.html

Andere Tipps

Spezielle Symbole für Überlastung listet das Verhalten von Perl für ‚=‘ zu überlasten.

  

Der Wert für „=“ ist ein Verweis auf eine Funktion mit drei Argumenten, das heißt, es sieht aus wie die anderen Werte im Einsatz Überlastung. Allerdings ist es nicht überlastet den Perl-Zuweisungsoperator. Dies würde gegen Kamelhaar.

So werden Sie wahrscheinlich Ihren Ansatz zu überdenken müssen.

Sie wissen über Config :: IniFiles ? Sie könnten, dass beachten, bevor Sie es gehen und neu zu erfinden. Mit einigen richtigen Subclassing können Sie Bestellung, um es hinzuzufügen.

Auch ich denke, Sie die falsche Schnittstelle haben. Sie Freilegung der inneren Struktur des Objekts und durch magische Zuweisungen ändern. Methoden verwenden würde Ihr Leben viel einfacher machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top