2010-10-18 19 views
13

Ich bin komplett neu in Perl. Ich musste ein externes Modul HTTP :: BrowserDetect verwenden. Ich habe Code getestet und versucht, den Namen des Betriebssystems von der Methode os_string abzurufen. Also habe ich das Objekt einfach initialisiert und eine Variable erstellt, um den zurückgegebenen Wert zu speichern.Wie kann ich einen Standardwert für eine Perl-Variable festlegen?

my $ua = HTTP::BrowserDetect->new($user_agent); 
my $os_name = $ua->os_string(); 

print "$user_agent $os_name\n"; 

gibt es einige User Agents, die nicht Browser-Agenten-Benutzer sind, damit sie nicht jeden Wert von os_string erhalten. Ich erhalte einen Fehler Use of uninitialized value $os_name in concatenation (.) or string

Wie behandle ich solche Fälle, wenn der $ os_name nicht initialisiert wird, weil die Methode os_string undef zurückgibt (das ist, was ich denke, passiert beim Lesen des Moduls Quellcode). Ich denke, es sollte eine Möglichkeit geben, eine Standardzeichenfolge, z. Kein Betriebssystem in diesen Fällen.

Antwort

17
my $os_name = $ua->os_string() || 'No OS'; 

Wenn $ua->os_string() falsy ist (das heißt: undef, Null oder die leere Zeichenkette), dann wird der zweite Teil des Ausdrucks || wird bewertet (und wird der Wert des Ausdrucks sein).

+0

danke, das war wirklich ein sehr einfaches Problem in der Tat :). – sfactor

26

Bitte beachten Sie: der Ansatz der ursprünglichen Antwort ($var = EXPRESSION || $default_value) würde den Standardwert für ANY "Perl falsche Werte", die aus dem Ausdruck, z. Wenn der Ausdruck eine leere Zeichenfolge ist, verwenden Sie stattdessen den Standardwert.

In Ihrem speziellen Beispiel ist es wahrscheinlich das Richtige (Betriebssystemname sollte keine leere Zeichenfolge sein), aber im Allgemeinen kann es ein Fehler sein, wenn Sie eigentlich nur den Standardwert verwenden wollten von undef.

Wenn Sie nur undef Werte, vermeiden wollen, aber nicht leere Zeichenfolge oder Nullen, können Sie tun:

  • Perl 5.10 und höher: verwenden Sie den "Defined oder Operator" (//):

    my $os_name = $ua->os_string() // 'No OS'; 
    
  • Perl 5.8 und früher: einen bedingten Operator verwenden, da definiert-oder noch nicht zur Verfügung:

    my $os_string = $ua->os_string(); # Cache the value to optimize a bit 
    my $os_name = (defined $os_string) ? $os_string : 'No OS'; 
    # ... or, un-optimized version (sometimes more readable but rarely) 
    my $os_name = (defined $ua->os_string()) ? $ua->os_string() : 'No OS'; 
    

Viel mehr in tiefen Einblick in das Thema (einschließlich Einzelheiten über //) sind in brian Post d foy hier: http://www.effectiveperlprogramming.com/2010/10/set-default-values-with-the-defined-or-operator/

+1

Ich habe kürzlich einen Fehler in meinen Code eingeführt, indem ich den '||' Ansatz verwende. Ich habe das Problem vor diesem Post gefunden, wusste aber nicht über den "Defined-or" -Operator. Lernen Sie jeden Tag etwas Neues mit Perl. – ThisSuitIsBlackNot

Verwandte Themen