2016-06-29 4 views
0

Ich möchte nur wissen, was der Prozess hinter dem Zusammenführen eines Wertes in einen Hash ist. Ich habe einen Hash, der 5 bis 6 Schlüssel hat, abhängig davon, ob der Fehler Laufzeitwerte ausgibt. Die Methode, die die Argumente annimmt, nimmt auch zuerst eine Fehlernachrichtenzeichenfolge an. Ich möchte, dass es in der Lage ist, diese Fehlermeldung Zeichenfolge in den Hash hinzuzufügen, um einen großen Hash im Grunde zu machen.Wie man einen skalaren Wert (String) zu einem vorhandenen Hash in Perl hinzufügt

Dies ist, wie die Methode aufgerufen werden würde:

ASC::Builder::Error->new("Simple error message here", code => "UNABLE_TO_PING_SWITCH_ERROR", switch_ip => $ip3, timeout => $t1); 
  • Die letzten zwei Werte der Laufzeit-Parameter/Werte Schlüssel innerhalb des Kontextschlüssel in dem Fehler Hash zuweisen.
  • Hier ist ein Blick auf die Fehler hash:

    use constant ERROR_CODE => { 
        UNABLE_TO_PING_SWITCH_ERROR => { 
         category => 'Connection Error', 
         template => 'Could not ping switch %s in %s seconds.', 
         context => [qw(switch_ip timeout)], 
         tt => {template => 'disabled'}, 
         fatal => 1, 
         wiki_page => 'www.error-solution.com/ERROR_CODE_A', 
        } 
    }; 
    

Hier ist meine Methode, um den Fehler Hash und konstruieren die Nachricht

sub _create_error_hash { 
    my $error_string = shift;                                        if(defined($params{code}) {      
    my $first_param = delete $params{code};                                        
     foreach my $key (@{$first_param->{context}}) {                                      
      $first_param->{$key} = $key;                                         
     }                                                 
     my @template_args = map { $first_param->{$_}} @{$first_param->{context} };                               
     $first_param->{message} = sprintf($first_param->{template}, @template_args);                 }              
     return bless $first_param;                                           
    } 

sub _merge_hashes { 
    my ($message = {message => $messsage}, $first_param = {first_param => $first_param}) = @ _; 
    #merge these two hashes and bless into $class (don't know how to merge hashes) 
    my %merged_hash = ($message, $first_param); 
    return bless $merged_hash, $class; 
} 

Der Ausgang des _create_hash sollte der sein, zu manipulieren Eingabe für _merge_hashes Nicht sicher, ob ich das richtig gehandhabt habe. Diese Methoden werden in der neuen Methode verwendet (was momentan ein Chaos ist) und deshalb nicht enthalten ist.

Das ist nur ein Versuch, ein Beispiel, das ich auf PerlMonks gesehen, ist hier der Link: http://www.perlmonks.org/?node_id=14263

+0

Nur ein Hinweis - denken Sie daran, dass Sie der Konstruktor will ein richtiges Objekt zurück, so dass die 'new' Methode sollte zurückkehren ein "bless-ed ref", damit der aufrufende Code richtig funktioniert. Normalerweise ist es "neu", das "segne $ self, $ class" zurückbringt. Innerhalb dieser Klasse können Sie innerhalb der Klasse natürlich andere Subs anrufen, um die Arbeit zu organisieren. – zdim

Antwort

1

ich mit der einfachen Erklärung, wie beginnen werde einen Hash in Perl fusionieren, ist es ziemlich einfach .

use strict; 
use warnings; 

use Data::Printer; 

my (%a, %b, %c); 

%a = (a => 1, b => 2); 
%b = (a => 0, c => 3, d => 4); 
%c = (%a, %b); 

p(%c); # { a => 0, b => 2, c => 3, d => 4 } 

Sie werden mit den a Tasten beachten Sie, dass, wenn es Duplikate sind, was auch immer Wert im zweiten Satz erscheint, ist derjenige, der ‚gewinnt‘ sein.

Ich habe ehrlich gesagt keine Ahnung, was diese zweite Funktion macht, weil sie Variablen referenziert, die praktisch in keiner Zeile existieren. (Das create one macht das auch, aber nur auf ein paar Zeilen).

Aus Ihrer Beschreibung Ich glaube, Sie nur eine einzige Taste hinzugefügt werden sollen, so dass Sie nicht wirklich tun müssen, dass, obwohl, sollten Sie in der Lage sein, nur den Schlüssel zu dem ursprünglichen Objekt hinzufügen: $error->{messsage} = $message

Aber man unter der Annahme, wollte in zwei Hashreferenzen passieren und kombiniert sie, würde es in etwa so aussehen:

sub merge { 
    my ($first, $second) = @_; 
    my %merged = (%$first, %$second); 
    return bless \%merged, $class; 
} 
+0

yeah Ich möchte nur einen einzigen Schlüssel, mein Gedanke, Referenzen zu verwenden, war, dass die Hashes bereits in der new() -Methode erstellt wurden, die beides verbraucht. Dies hat mir ein besseres Verständnis gegeben, ich bin nur nicht sicher, wenn ich die Ausgabe von einem in den anderen übergebe, sollte ich Segensausgaben sein, ist '$ first_param' gemeint als" UNABLE_TO_PING SWITCH_ERROR "', nachdem der Code entfernt wurde. –

+0

Alle Segen Does assoziieren einen Paketnamen mit einer bestimmten Referenz für die Verwendung in Methodensuche, so dass Sie es normalerweise nur auf der obersten Ebene Objekt haben. –

+0

Und wenn Sie sagten, dass die Fehlermeldung der Schlüssel des Wertes sein soll, können Sie das tun $ error -> {$ message} = $ hashRef' –

Verwandte Themen