Ich habe einen großen Hash von Arrays,
%qual<discordant>
(~ ca. 13199 Werte wie '88 .23 ', '99 .23' usw.
die von 88-100 reicht und aus Textdateien eingelesen wird,
und wenn ich drucke %qual<discordant>.min
und %qual<discordant>.max
sehe, dass die Werte eindeutig falsch sind.
Ich kann dies beheben, indem ich ändere, wie die Daten aus den Textdateien eingelesen werden:
%qual{$type}.push: @line[5]
zu
%qual{$type}.push: @line[5].Num
Dies war jedoch nicht intuitiv. Ich brauchte einige Minuten, um herauszufinden, warum Raku / Perl6 zunächst eindeutig falsche Antworten gab. Es wäre sehr leicht gewesen, diesen Fehler zu übersehen. In perl5 besteht das Standardverhalten darin, diese Zeichenfolgen ohnehin wie Zahlen zu behandeln.
Es sollte eine Steueranweisung geben, um dies zum Standardverhalten zu machen. Wie kann ich das tun?
@line
gefüllt?@line
wird aus Textdateien gefüllt,my @line = $line.split(/\s+/)
my @line = $line.words
wird dann schneller sein.Antworten:
Das Problem / Merkmal ist wirklich, dass in Raku beim Lesen von Zeilen aus einer Datei Zeichenfolgen (auch als Typobjekte bezeichnet
Str
) werden. Wenn Sie anrufen.min
und.max
auf einem Array vonStr
Objekten, dann wird String Semantik verwendet werden , um festzustellen , ob etwas größer oder kleiner ist.Es gibt spezielle Werte in Raku, die sich wie Werte in Perl verhalten. In Raku werden diese " Allomorphe " genannt. Sie sind
Str
, aber auchNum
, oderRat
, oderInt
, oderComplex
.Die Syntax zum Erstellen eines geeigneten Allomorphs für einen String in
$_
lautet<< $_ >>
. Wenn Sie also die Zeile ändern, in der die Wörter lauten:dann sind die Werte in
@line
entwederStr
oderIntStr
oderRatStr
. Welches sollte machen.min
und.max
funktionieren, wie Sie erwarten.Wenn Sie jedoch sicher sind, dass nur das 5. Element von
@line
numerisch sein wird, ist es wahrscheinlich effizienter, dasStr
in eine Zahl umzuwandeln , bevor Sie es in das Array verschieben. Eine kürzere Syntax dafür wäre das Präfix a+
:Obwohl Sie das vielleicht zu laut finden.
UPDATE: Ich hatte vergessen, dass es tatsächlich ein Sub namens gibt
val
, das ein nimmtStr
und ein entsprechendes Allomorph davon erstellt (oder das Original zurückgibtStr
). Der Code zum Erstellen@line
könnte also wie folgt geschrieben werden:quelle
.Numeric
lieber+
als teilweise, um zu viele Symbole in einer Reihe zu vermeiden, aber auch, weil es ein bisschen mehr herausspringt, um zu sagen "Hey, ich brauche das als Zahl",+
ist es klein genug, dass es verloren gehen kann das Mischen (dito für~
vs.Str
).83.44
numerisch zu betrachtenval($line)
würde es nicht für dich tun?