数値文字列を数値として解釈させる楽制御ステートメント


8

配列のハッシュが大量にあり、

%qual<discordant> (「88.23」、「99.23」などの約13199の値など。

88-100の範囲で、テキストファイルから読み込まれます。

印刷する%qual<discordant>.min%qual<discordant>.max、値が明らかに間違っていることがわかります。

これを修正するには、テキストファイルからデータを読み取る方法を変更します。

%qual{$type}.push: @line[5]

%qual{$type}.push: @line[5].Num

しかし、これは直感的ではなく、なぜRaku / Perl6が最初は明らかに間違った答えを出していたのかを理解するのに数分かかりました。このエラーを見逃すことは非常に簡単でした。perl5では、デフォルトの動作では、これらの文字列を数値のように扱います。

これをデフォルトの動作にするための制御ステートメントが必要ですが、どうすればよいですか?


1
どのよう@lineに満たされますか?
エリザベスマッティセン

@lineテキストファイルから満たされているmy @line = $line.split(/\s+/)
詐欺

my @line = $line.wordsその後、より速くなります。
Elizabeth Mattijsen

回答:


10

問題/機能は、Rakuでファイルから行を読み取ると、それらが文字列(タイプのオブジェクトStr)になることです。あなたが呼び出した場合.min.maxのアレイ上Strのオブジェクト、文字列の意味は何かが大きくか小さいかを決定するために使用されます。

Rakuには、Perlの値のように機能する特別な値があります。楽では、これらは「異形体」と呼ばれます。それらはStr、またNum、またはRat、またはInt、または、またはComplexです。

の文字列に適切な同形異義語を作成するための構文$_<< $_ >>です。したがって、単語を読み取る行を次のように変更すると、

my @line = $line.words.map: { << $_ >> }

その後の値@lineの意志はどちらかStr、またはIntStrRatStr。あなたが期待するように作り.min.max機能するはずです。

ただし、の5番目の要素のみ@lineが数値になることが確実な場合はStr、配列にプッシュする前にを数値に変換する方が効率的です。そのための短い構文は、接頭辞a +です:

%qual{$type}.push: +@line[5]

あなたはそれがあまりにも騒々しいことに気付くかもしれませんが。

UPDATE:私はと呼ばれるサブ実際にありますことを忘れていたval取りStr、それを適切な異形態を作成する(または元を返しますがStr)。したがって、作成用のコード@lineは次のように書くことができます。

my @line = $line.words>>.&val

1
多くの場合、一部の.Numeric代わりに使用+して、すべてのシンボルが連続しすぎないようにしますが、「ねえ、私はこれを数値として必要としています」と言って少し飛び出すので+、シャッフル(~vsの同上.Str)。
user0721090601

Rakuのデフォルトの動作はPerlに似ていると思います。つまり、基本的にすべてが同型であり、より簡単で直感的です。デフォルトでは83.44、数値のような文字列を考慮する必要があると思います
con

Rakuでアロモルフを作成するのは面倒です。正しいアロモルフタイプを作成できるようにするには、作業を行う必要があるからです。これはPerlとは対照的です。Perlには明示的な型指定がないため、変数が数値コンテキストで実際に使用されるときにその作業が行われます。したがって、すべてを異型として作成しないことは、非常によく考えられた設計上の決定であるだけでなく、それを行わないパフォーマンス上の理由もあります。
Elizabeth Mattijsen、

fwiw rakuは「私が言っていることを実行する」べきだと思います... << $ _ >>は非常にうるさいです...ですから、速度に関係なく、メソッドがあります。これについて$ line.alloとしましょう。(はい私は私がそれを書くことができることを知っています!)
p6steve

val($line)あなたのためにそれをしませんか?
Elizabeth Mattijsen、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.