Question

Je choisis d'utiliser cravate et trouver ceci:

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

si je retire le dernier "$ [0] -> {$ [1]} -> { '='};", il ne fonctionne pas correctement. Pourquoi?

Je sais une valeur de retour est nécessaire. Mais "$ [0] -> {$ [1]};" peut ne pas fonctionner correctement soit, et $ [0] -> {$ [1]} -.> { '='} n'est pas la chose


Ancien poste:

Je suis écrire un paquet en Perl pour analyser les fichiers INI. Juste quelque chose basé sur Config::Tiny .

Je veux garder l'ordre des sections et des clés, donc j'utiliser le tableau supplémentaire pour stocker l'ordre.

Mais quand je l'utilise « $Config->{newsection} = { this => 'that' }; # Add a section », je dois surcharger « = » de sorte que « newsection » et « ce » peut être poussé dans le tableau.

Est-ce possible de faire le travail "de $Config->{newsection} = { this => 'that' };" sans influence d'autres parties?

Une partie du code est:

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{']'}}) {
}}
Était-ce utile?

La solution

Ce n'est pas exactement JUSTE surcharge d'opérateur, mais si vous avez absolument besoin de cette fonctionnalité, vous pouvez essayer un lien perl: http://perldoc.perl.org/functions/tie.html

Autres conseils

Symboles spéciaux pour surcharge répertorie le comportement de surcharge Perl pour « = ».

  

La valeur de « = » est une référence à une fonction de trois paramètres, à savoir, il semble que les autres valeurs dans la surcharge d'utilisation. Cependant, il ne surcharge pas l'opérateur d'affectation Perl. Cela irait à l'encontre des cheveux Camel.

Vous aurez probablement besoin de repenser votre approche.

Connaissez-vous Config :: IniFiles ? Vous pourriez considérer que avant de partir et réinventent. Avec un peu subclassing approprié, vous pouvez ajouter la commande à elle.

En outre, je pense que vous avez la mauvaise interface. Vous exposer la structure interne de votre objet et le modifier grâce à des affectations magiques. L'utilisation de méthodes rendrait votre vie beaucoup plus facile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top