Проблема / особенность заключается в том, что в Raku, когда вы читаете строки из файла, они становятся строками (или объектами типа Str
). Если вы вызовете .min
и .max
для массива из Str
объектов, то семантика строки будет использоваться для определения того, что-то больше или меньше.
Там - это специальные значенияв Раку, которые действуют как ценности в Perl. В раку это называется " алломорф ". Это Str
, но также Num
, или Rat
, или Int
, или Complex
.
Синтаксис для создания соответствующего алломорфа для строки в $_
: << $_ >>
. Поэтому, если вы измените строку, которая читает слова, на:
my @line = $line.words.map: { << $_ >> }
, тогда значения в @line
будут либо Str
, либо IntStr
, либо RatStr
. Что должно заставить .min
и .max
работать так, как вы ожидаете.
Однако, если вы уверены, что только 5-й элемент @line
будет числовым, то, вероятно, будет более эффективно преобразоватьStr
до числа перед передачей в массив. Более коротким синтаксисом для этого будет префикс +
:
%qual{$type}.push: +@line[5]
Хотя это может показаться слишком строковым.
ОБНОВЛЕНИЕ: Я забыл, что на самом деле есть подпрограмма с именемval
, который принимает Str
и создает соответствующий ему алломорф (или возвращает оригинал Str
). Таким образом, код для создания @line
может быть записан как:
my @line = $line.words>>.&val