2016-06-04 9 views
4

Ich habe eine Datei mit dem Namen a.gz die eine gzip-Datei, die die folgenden Zeilen enthält, wenn dekomprimiert:Perl in Backticks Hashreferenz geben unterschiedliche Ergebnisse

a 
b 

Unten sind zwei Blöcke von Perl-Code, die ich denke " sollte "die gleichen Ergebnisse geben, aber sie nicht.

Code # 1:

use Data::Dumper; 
my $s = { 
     status => 'ok', 
     msg => `zcat a.gz` 
}; 
print Dumper($s),"\n"; 

Code # 2:

use Data::Dumper; 
my $content = `zcat a.gz`; 
my $s = { 
     status => 'ok', 
     msg => $content 
}; 
print Dumper($s), "\n"; 

Code # 1 ergibt folgendes Ergebnis:

Odd number of elements in anonymous hash at ./x.pl line 8. 
$VAR1 = { 
      'msg' => 'a 
', 
      'b 
' => undef, 
      'status' => 'ok' 
     }; 

Code # 2 liefert das folgende Ergebnis:

$VAR1 = { 
      'msg' => 'a 
b 
', 
      'status' => 'ok' 
     }; 

ich Perl 5.10.1 läuft in Linux

Antwort

6

perldoc perlop mit:

Im skalare Kontext, es kommt wieder als ein einziges (möglicherweise mehrzeiligen) String oder undef wenn der Befehl fehlgeschlagen . Gibt im Listenkontext eine Liste von Zeilen zurück (Sie haben jedoch Zeilen mit $/ oder $INPUT_RECORD_SEPARATOR definiert) oder eine leere Liste, wenn der Befehl fehlgeschlagen ist.

Zuordnung zu einem Skalar puts `` im skalaren Kontext; Verwenden Sie es in { ... } setzt es in Liste Kontext.

{ LIST } nimmt eine Liste und interpretiert ihren Inhalt abwechselnd zwischen Schlüssel und Werten, d. H. key1, value1, key2, value2, key3, value3, .... Wenn die Anzahl der Elemente ungerade ist, erhalten Sie eine Warnung (und der fehlende Wert wird als undef angenommen).

LIST , LIST (der Komma-Operator im Listenkontext) verkettet zwei Listen.

=> funktioniert genau wie ,, aber zitiert automatisch den Bezeichner zu seiner Linken (wenn es einen gibt).

+0

Danke. Ich war mir nicht bewusst, dass die Schlüssel/Wert-Zuweisung in '{....}' Array-Kontext ist. Ich dachte, dass Werte immer skalar sind. Danke, dass du darauf hingewiesen hast. –