Manchmal bringt mich meine APL-Vertrautheit auf algorithmische Ideen zur Problemlösung, die ich dann in einer anderen Sprache - zum Beispiel Perl - neu implementiere.
Ich habe also eine Textdatei verarbeitet, um einen booleschen Vektor zu erstellen, der die verwendeten Felder in einer abgegrenzten Datei angibt, und möchte nun die Indizes dieser verwendeten Felder und die Namen der verwendeten Felder ausgeben. In APL würde ich den Komprimierungsoperator über den Vektor der Feldnamen und über das Jota der Anzahl der Felder verwenden.
In Perl habe ich dies getan:
my @UsedFieldNames = map { $UsedFields[$_] ? $FieldNames[$_] : () } 0 .. $#UsedFields;
y
say join " ", map { $UsedFields[$_] ? $) : () } 0 .. $#UsedFields;
donde @UsedFields
ist ein Array, das 0 für unbenutzte und 1 für benutzte Felder enthält.
-
Ich mag es nicht wirklich, die Karte mit
?:()
um eine Komprimierung zu simulieren - gibt es einen besseren Weg (mein echtes Programm macht es ein drittes Mal, wenn es eine vertikale oder Verkleinerung über die Datei simuliert)? -
Ich mag es nicht wirklich, die Karte über die Indizes zu tun, um die Ergebnisse zu erhalten - gibt es einen besseren Weg, das zu berechnen? (Ich schätze, eine Optimierung wäre, zuerst die verwendeten Indizes zu berechnen, dann
@UsedFieldNames = @FieldNames[@UsedIndexes];