2017-03-28 3 views
0

Bitte überprüfen Sie den Code unten:einen Schlüssel verwenden, die den Wert einer Konstante in einem Hash in Perl ist

my %hash = (
123 => "a", 
456 => "b", 
); 
use constant x_1 => 123; 
use constant x_2 => 456; 

ich so etwas wie $ hash verwenden möchten {x_1} "a" zu bekommen. Ich habe versucht, x_1 in eine Variable zu speichern und sie dann als Schlüssel zu verwenden, es hat funktioniert. Wie

my $var = "x_1"; # or my $var = x_1 

Aber wenn ich die Variable x_1 aus einem Array erhalten, die ich in einer Variablen speichern, und dann versuchen, den Hash aus dieser Variable zuzugreifen, zeigt es einen Fehler. Wie

my @arr; 
$arr[0]{"y_1"} = "x_1"; 
$arr[0]{"z_1"} = "x_2"; 
my $newVar = $arr[0]{"y_1"};#$newVar = x_1 
print $hash{$newVar}; #this shows error. 

Wie konnte ich die Variable nicht als String, sondern als hier konstant?

+0

Syntaxfehler: use =>, not = ... 'Konstante verwenden x_1 => 123;' – toolic

+0

Entschuldigung. Korrigiert jetzt – aayu5h

+0

Syntaxfehler: '$ arr {" y_1 "} =" x_1 ";'. Arrays verwenden '[]'. Hashes verwenden '{}' – stevieb

Antwort

1

I want to use something like $hash{x_1} to get "a"

Wenn Sie alles außer einem Bezeichner verwenden, wird der Ausdruck nicht automatisch in Anführungszeichen gesetzt. Zum Beispiel könnten Sie eine der folgenden Bedingungen verwenden:

  • $hash{+CONSTANT}
  • $hash{(CONSTANT)}

So Sie $hash{+x_1} statt $hash{x_1} nutzen könnten.


How could I use the variable not as a string but as a constant here?

Sie zu Recht zu tun dies, indem use strict; Zugabe verhindert fragen, weil es dangerous (was bedeutet, schwer zu lesen, schwer schwer zu debuggen, zu halten, etc, etc, etc) ist.

Lösung 1: Verwenden Sie eine Nachschlagetabelle.

my %lookup = (
    x_1 => x_1, 
    x_2 => x_2, 
); 

my @arr; 
$arr[0]{"y_1"} = "x_1"; 
$arr[0]{"z_1"} = "x_2"; 

my $newVar = $arr[0]{"y_1"}; 
defined(my $key = $lookup{$newVar}) 
    or die("Invalid key"); 

print $hash{$key}; 

Lösung 2: Verwenden Sie den Wert der Konstante anstelle ihres Namens.

my @arr; 
$arr[0]{"y_1"} = x_1; 
$arr[0]{"z_1"} = x_2; 

my $newVar = $arr[0]{"y_1"}; 
print $hash{$newVar}; 
+0

Antwort auf die zweite Frage in Frage hinzugefügt. – ikegami

+0

Danke. Ich habe Solution1 ausprobiert und es hat funktioniert. Wenn ich den Schlüssel als hexadezimalen Wert benötige, wie okt ("0x0"), okt ("0xff"), dann funktioniert diese Lösung nicht, da Perl den Schlüssel für Dezimalwerte ändert und dann nicht mit dem Schlüssel übereinstimmt in hash.And die Konstante zeigt auch auf einen Hexadezimalwert. Gibt es einen Workaround dafür? – aayu5h

+0

Fragen Sie, wie man eine Zahl in Hex konvertiert? 'sprintf"% X "' – ikegami

0

Eine Konstante ist nur ein Perl-Subroutine, und eine Variable, die den Namen eines Unterprogramms oder ein Verweis auf ein Unterprogramm dereferenziert werden kann hält das Unterprogramm aufzurufen.

use constant x_1 => 123; 
my %hash = (123 => 'a', 456 => 'b'); 
my @arr = ({ y_1 => 'x_1', z_1 => 'x_2' }); 

# $arr[0]{y_1} holds 'x_1' 
# $arr[0]{y_1}->() calls 'x_1'->(), or &x_1() 
# can also say &{$arr[0]{y_1}} 
my $key = $arr[0]{y_1}->(); 
print $hash{$key};   # 'a' 

Diese Konstruktionen auf unter use strict verpönt sind (Sie tun use strict, nicht wahr?), Was bedeutet, dass Sie Ihr Design zu überdenken sollten.

+0

Re "* Diese Konstruktionen sind unter' use strict' * "verpönt", Vorgeschlagene Umformulierung: * Sie bitten zu Recht, dies durch Hinzufügen von 'use strict; zu verhindern, weil es [gefährlich] ist (http: // perl. plover.com/varvarname.html).* – ikegami

Verwandte Themen