2009-07-01 10 views
1

Ich versuche, ein grundlegendes System zur Fehlerprüfung einrichten, wo Shell-Fehler von einem Systemaufruf abgefangen werden. execute_command ist eine Webmin-Funktion, die einen Systemaufruf ausführt und dann eine Fehlermeldung auf ihren 4. Parameter setzt. Ich nenne grundsätzlich execute_command_error („adduser-Test“), wohl wissend, dass ich bereits einen Benutzer namens Test auf meinem vordefinierten Arrays erstellt und basiert id erwarten, dass esMehrdimensionale Arrays mit Ganzzahlen und Strings

Drucken nicht Benutzer
Können add hinzufügen dieser Benutzer, weil es bereits auf dem System existiert.

sondern ich:

Uhhhhhhhhh?
Uhhhhhhhhh?

Ich habe überprüft, dass $ exe und $ Return "adduser" und 1, respektvoll sind. Was verstehe ich nicht über Arrays? Es scheint, die Zeichenfolge und/oder Nummer zu ignorieren und nur nach der letzten Definition mit 3 Elementen zu gehen. Was ist eine Lösung oder eine bessere Lösung? Hier

ist ths Code:

$ErrorMsg['adduser',1,'title'] = "Unable to add user"; 
$ErrorMsg['adduser',1,'msg'] = "Unable to add that user because it already exists on the system."; 
$ErrorMsg['random',2,'duaisdhai'] = "Uhhhhhhhhh?"; 

sub execute_command_error 
{ 
    my $error = ""; 
    my $cmd = $_[0]; 

    $return = execute_command($cmd, undef, undef, \$error)>>8; 
    if ($error) { 
     my ($exe) = $cmd =~ m|^(.*?)[ ]|; 

     $exe_title = $ErrorMsg[$exe,$return,'title']; 
     $exe_msg = $ErrorMsg[$exe,$return,'msg']; 


     print $exe_title."<br>"; 
     print $exe_msg ."<br>"; 
    } 
} 

Update:

Ich denke, dass ich Hashes zu verwenden, ich habe keine Ahnung, warum ich dachte, ich Strings in Indizes verwenden könnten. Mit dieser sagte, hat wenig Forschung mich zu so etwas wie dies führt:

%ErrorMsgs = ('adduser' => { 
       '1' => { 
        'title' => 'Unable to add user', 
        'msg' => 'Unable to add that user because it already exists on the system.', 
       }, 
      }, 
      ); 

Nun, wie würde ich es mit einer Variablen verweisen? weil keiner dieser Arbeit:

$exe_title = $ErrorMsgs{"$exe"}{"$return"}{"title"}; 
    $exe_title = $ErrorMsgs{$exe}{$return}{title}; 

Antwort

2

Zunächst dafür multidimensionalen Strukturen perldsc für die richtige Syntax sehen. Deine Arrays ergeben keinen Sinn.

Wenn Sie warnings aktiviert hatten, hätten Sie die Warnung "Argument ist nicht numerisch" sehen können, um Ihnen mitzuteilen, dass Sie keine Strings sinnvoll in einem Array-Index verwenden können.

Aber der Hash, den Sie in Ihrem Update gepostet haben, sollte gut funktionieren.

#!/usr/bin/perl 

use strict; 
use warnings; 
## ^^ these things are your friends 

my %ErrorMsgs = ('adduser' => { 
         '1' => { 
           'title' =>  'Unable to add user', 
           'msg' =>  'Unable to add that user because it already exists on the system.', 
         }, 
       }, 
       ); 

my $exe = 'adduser'; 
my $return = 1; 

print $ErrorMsgs{$exe}{$return}{title}; # works 

Wenn Sie nicht die Ausgabe, die Sie erwarten bekommen, dann ist es, weil es etwas falsch mit $exe oder $return - sie könnten nicht in den Rahmen definiert werden, in dem Sie versuchen, sie zu nutzen. Durch Aktivieren von und Warnungen können Sie das Problem nachverfolgen.

1

{'key' => 'val'} erstellt eine Hash-Referenz, so dass Sie vor der Suche nach einem Schlüssel dereferenzieren.

Sie müssen auch $ exe oder $ return nicht angeben, da diese bereits Strings enthalten.

Beachten Sie, dass Perl keine mehrdimensionalen Indizes unterstützt; Ein mehrdimensionales Array ist nur ein Array von Arrays, daher müssen Sie [] für jeden Index verwenden. Im skalaren Kontext gibt der Komma-Operator den Wert des am weitesten rechts stehenden Ausdruck, so dass die folgenden Zeilen sind äquivalent:

$ErrorMsg[0,1,2] = "foo"; 
$ErrorMsg[2] = "foo"; 

Beachten Sie, dass in Listenkontext der Komma-Operator eine Liste von Werten gibt, die uns Scheiben gibt:

@a=qw(f o o); 
@a[3,4,5] = qw(b a r); 
print join(',', @a), "\n"; 
# output: f,o,o,b,a,r 
@ErrMsg{qw(title msg)} = ('Unable to add user', 'Unable to add that user because it already exists on the system.') 
Verwandte Themen