Pregunta

decido usar corbata y encontrar esto:

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 quito el último "$ [0] -> {$ [1]} -> { '='};", que no funciona correctamente. ¿Por qué?

Sé que se requiere un valor de retorno. Pero "$ [0] -> {$ [1]};" no puede funcionar correctamente tampoco, y $ [0] -> {$ [1]} -.> { '='} no es todo el asunto


Mensaje viejo:

Soy escribir un paquete en Perl para analizar archivos INI. Sólo es algo basado en Config::Tiny .

Quiero mantener el orden de las secciones y llaves, así que usar una matriz extra para almacenar la orden.

Pero cuando se utiliza "$Config->{newsection} = { this => 'that' }; # Add a section", necesito sobrecargar '=' para que "newsection" y "esto" puede ser empujado en la matriz.

Es esto posible hacer "$Config->{newsection} = { this => 'that' };" trabajo sin influir en otras partes?

Una parte del código es:

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

Solución

Esto no es exactamente igual sobrecarga de operadores, pero si necesita absolutamente esta funcionalidad, puede probar un lazo Perl: http://perldoc.perl.org/functions/tie.html

Otros consejos

símbolos especiales para la sobrecarga enumera el comportamiento de Perl para sobrecargar '='.

  

El valor para "=" es una referencia a una función con tres argumentos, es decir, parece que los otros valores en la sobrecarga de uso. Sin embargo, no se sature el operador de asignación de Perl. Esto iría en contra de pelo de camello.

Así que probablemente tendrá que reconsiderar su enfoque.

¿Sabe usted acerca de Config :: IniFiles ? Se podría considerar que antes de ir y reinventarlo. Con un poco de subclases adecuado, puede agregar pedido a él.

Además, creo que usted tiene la interfaz equivocada. Usted está exponiendo la estructura interna de su objeto y su modificación a través de asignaciones mágicos. El uso de métodos haría su vida mucho más fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top