Posso sovraccaricare = del Perl? (E un problema durante l'utilizzo Tie)
-
18-09-2019 - |
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{']'}}) {
}}
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.