Perl: Ziehen Paare von Werten aus einem array
Betrachten
#!/usr/bin/perl
use strict;
use warnings;
while(<DATA>) {
my($t1,$t2,$value);
($t1,$t2)=qw(A P); $value = $1 if /^$t1.*$t2=(.)/;
($t1,$t2)=qw(B Q); $value = $1 if /^$t1.*$t2=(.)/;
($t1,$t2)=qw(C R); $value = $1 if /^$t1.*$t2=(.)/;
print "$value\n";
}
__DATA__
A P=1 Q=2 R=3
B P=8 Q=2 R=7
C Q=2 P=1 R=3
Ich würde gerne ersetzen die Wiederholung mit einer eleganten Schleife über Paare von $t1,$t2 gespeicherten Werte in einem array (oder anderen Struktur) wie ein
my @pairs = qw (A,P B,Q C,R);
my @pairs = qw (A P B Q C R);
Habe ich nicht viel Erfolg hatte mit einer kurzen Versuch zu kombinieren, die while
, split
und unshift
.
Was prägnant, elegante Lösung bin ich?
P. S. ich habe die hashes in der Vergangenheit, sondern finden die %h = (A=>'P', B=>'Q', C=>'R')
syntax "laut". Es ist auch hässlich, zu verlängern triplets, quads ...
- Sie brauchen nicht die hash-syntax, um einen hash.
%h = qw/A P B Q C R/;
wird genauso gut funktionieren, solange es eine gerade Anzahl von Elementen. - +1 vielen Dank für den Hinweis.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ein hash +
each
ist nicht gut genug (weilgibt es die
List::MoreUtils::natatime
Methode:In der Regel, obwohl, ich werde einfach
splice
die ersten paar Elemente der Liste für eine Aufgabe wie diese:Verwenden Sie einen hash.
Sofern Sie nicht garantieren können, dass die erste Koordinate wird immer eindeutig sein-die Idee von ein paar besser vertreten als einzelne array mit zwei Elementen. Sie können auch erweitern die gleiche Idee Tupel von höheren Dimensionen viel leichter.
Aber mit deiner Methode und der Methode oben, die Sie ausführen, mehr Spielbetrieb als notwendig (drei pro Zeile anstatt einer). Das macht @eugene die Antwort effizienter.
Einer Allgemeinen Lösung ist zu verwenden:
Die nette Sache über dieses ist, die Sie anpassen können für Tupel von Dimensionen größer als zwei.
Auch, dass du nun die Auswahl der Muster basiert auf dem ersten Zeichen der Zeile, die Muster selbst werden einfacher:
Einfachere alternative (was bedeutet, dass die Erfassung aller
x=y
) ist:Letzteres macht es auch leicht zu ziehen ist, mehrere Werte aus einer Zeile:
Erweitern auf meinen Kommentar.
Anderswo, Tad McLellan beobachtet, dass die Daten, die sieht aus wie ein HoH und schlug vor: