2 Stimmen

Holen Sie Hash-Schlüssel/Werte in der gleichen Zeile wie den Funktionsaufruf

Hier ist der Code, um das Problem zu reproduzieren:

sub hallo { return (h => 1, n => 1); }
print join ", ", Werte hallo();

Ich bekomme den Fehler:

Typ des Args 1 für Werte muss Hash sein (nicht Eintrag der Unterfunktion) bei - Zeile 4, in der Nähe von ");" Ausführung von - abgebrochen aufgrund von Kompilierungsfehlern.

Ich weiß, dass ich den Aufruf und den print auf zwei Zeilen aufteilen kann:

sub hallo { return (h => 1, n => 1); }
my %hash = hallo();
print join ", ", Werte %hash;

Aber ich möchte das nicht tun. Gibt es einen Weg, dies in einer Zeile zu tun, so dass ich nicht die ganze Zeit temporäre Variablen erstellen muss?

9voto

mob Punkte 113680

Sie könnten Hash-Verweise verwenden:

sub hello { return {h => 1, n => 1}; }
print join ", ", values %{hello()};

aber sonst nicht. Perl kann den Rückgabewert einer Unterroutine entweder im Skalar- oder Listenkontext interpretieren, aber es gibt kein Konzept, einen Wert im Hash-Kontext zurückzugeben.


Aktualisierung: das funktioniert auch

sub hello { return (h => 1, n => 1); }
print join ", ", values %{{hello()}};

Die innere {} konvertiert die Ausgabe von hello() von einer Liste in eine Hash-Referenz. Die äußeren %{} dereferenziert den Hash.

(Zählt %{{}}} als Pseudo-Operator?)

8voto

Ich sehe den Nutzen in einem richtigen Programm nicht, aber ja, es ist möglich.

print join ", ", values %{{hello()}};

Erklärung: hello() ist eine Liste; {hello()} ist eine Hash-Referenz; %{{hello()}} ist ein Hash.

2voto

Axeman Punkte 29362

Etwas anderes, was du tun könntest, ist eine Toggle-Variable verwenden.

sub hello { return (h => 1, n => 1); }
my $toggle = 1;
print join ", ", grep { $toggle = !$toggle; } hello();

Etwas anderes, was du tun könntest, ist List::Pairwise verwenden

use List::Pairwise qw;
print join ", ", mapp { $b } hello();

Ich hatte nach etwas gesucht, um eine Liste von Namen-Wert-Paaren in einem "Stream" zu verarbeiten und hatte sogar mein eigenes erstellt, aber dann habe ich dies auf CPAN gefunden.

-1voto

Platinum Azure Punkte 43334

Ich glaube nicht, dass dies möglich ist, weil Perl nicht stark genug typisiert ist, um zu wissen, was Unterroutinen zurückgeben.

Soweit Perl betroffen ist, geben alle Unterroutinen einfach LISTEN zurück (oder ein einzelnes SCALAR). Listen können bestimmten Operationen unterzogen werden (Indizierung, Slicing, etc.), aber nichts, was eine ARRAY-Variable erfordert (wie push, pop, shift) oder eine HASH-Variable (einschließlich keys, values, delete, exists).

Die Zuweisung eines Hashes nimmt eine LISTE als Parameter (die Ihre Funktion zurückgibt) entgegen und erstellt einen assoziativen Hash, wobei jedes ungerade Element als Schlüssel für das nächste gerade Element dient. Erst nach dieser Zuweisung kann es in der Grammatik von Perl als HASH bezeichnet werden, und daher kann es erst dann in der Funktion values verwendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X