2017-03-13 4 views
0

Ich habe ein Problem in Perl. Ich hoffe, dass mir jemand helfen kann.undef-Variable von "if" Bedingung

my $bCommType = 'none'; 

my %commTypes = (
    'none'    => '0', 
    'public'   => '1', 
    'custom_percentage' => '2', 
    'custom_permeg'  => '2', 
    'custom_flat'  => '2', 
); 

my %rateTypes = (
    'custom_percentage' => '%', 
    'custom_permeg'  => '$', 
    'custom_flat'  => 'FLAT', 
    'none'    => 'none', 
); 

my $commrate = $rateTypes{$bCommType} if ($commTypes{$bCommType} == 2); 

meine Ausgabe in $commrate ist undef, kann mir jemand helfen, das Problem zu identifizieren?

+1

Was ist Ihre Frage? Du hast vergessen, einen zu fragen. Was möchten wir identifizieren? – simbabque

+0

mein $ commrate = $ rateTypes {$ bCommType} if ($ commTypes {$ bCommType} == 2); Ich bekomme einen undef Wert in meiner Variable. –

+2

[Es heißt Perl, nicht PERL.] (Https://en.wikipedia.org/wiki/Perl#Name) :) – simbabque

Antwort

2

Sie verwenden eine bedingte Deklaration. Das ist veraltet. Perl gibt Ihnen wahrscheinlich eine Warnung (Sie verwenden use warnings, richtig?).

Verschieben Sie die Deklaration in eine eigene Zeile, geben Sie einen Standardwert an, und führen Sie die Zuweisung mit der Bedingung in einer neuen Zeile aus.

my $commrate = 'default'; # it's not clear which %commTypes is the default 
$commrate = $rateTypes{$bCommType} if ($commTypes{$bCommType} == 2); 

Sie benötigen einen Standard oder Startwert zu liefern, da neue Variablen in Perl immer als undef beginnen.

+0

Danke, ich werde das versuchen. –

+0

dann, wie übergebe ich die bedingte Ausgabe an die Variable commrate? –

+0

@JonjonNegrite sorry, ich habe die Zuordnung vergessen. Aktualisiert. Die wichtigen Teile sind, dass 1) Sie die Variable deklarieren müssen, bevor Sie etwas bedingt zuweisen, und 2) Sie etwas zuweisen müssen, damit es nicht als 'undef' beginnt. – simbabque

2

Sie setzen $commrate-$rateTypes{$bCommType}, wenn der Wert von $commTypes{$bCommType} ist 2. Aber $bCommType ist none und $commTypes{none} ist Null, so dass die Zuordnung nicht geschieht und $commrate ist

nicht definiert, dass die Wurzel des Problems ist, aber abgesehen davon sollten Sie eine Variable nicht bedingt deklarieren. Es macht alle möglichen seltsamen und unbestimmten Dinge, wenn Sie es versuchen. Wie Simbabque gesagt hat, müssen Sie die Variable separat deklarieren und nur die Assignment konditional machen, aber in diesem Fall wird das Ergebnis aus dem gleichen Grund wie oben beschrieben

0

Dies ist eine bessere Möglichkeit, eine bedingte zu verwenden Erklärung. Diese Methode funktioniert, wenn Sie mit Perl, JavaScript, Java oder PHP arbeiten. Wo ich die Bedingung erklärt habe, ist die Aussage vor dem Fragezeichen die Bedingung. Der Wert direkt hinter dem Fragezeichen ist der Wert, der der Variablen zugewiesen wird, wenn die Bedingung wahr ist. Der Wert nach der Spalte ist der Wert, der der Variablen zugewiesen wird, wenn die Anweisung als falsch ausgewertet wird.

use strict; 
my $bCommType = 'none'; 

my %commTypes = (
    'none'    => '0', 
    'public'   => '1', 
    'custom_percentage' => '2', 
    'custom_permeg'  => '2', 
    'custom_flat'  => '2', 
); 

my %rateTypes = (
    'custom_percentage' => '%', 
    'custom_permeg'  => '$', 
    'custom_flat'  => 'FLAT', 
    'none'    => 'none', 
); 

my $commrate = $commTypes{$bCommType} == 2? $rateTypes{$bCommType} : "false value"; 

print $commrate;