Raku 数组不会排序

Raku array will not sort

我正在尝试对 list/array 个字符串进行排序:

> my @e = Q (list_regex_files json_file_to_ref write_2d_array_to_tex_tabular dir get_sample_ID density_scatterplot violin_plot multiline_plot ref_to_json_file execute venn barplot scatterplot_2d_color worksheet_to_hash group_bar workbook_to_hash read_table)

使用 https://docs.raku.org/type/Array#(List)_routine_sort 我尝试

> say @e.sort
(list_regex_files json_file_to_ref write_2d_array_to_tex_tabular dir get_sample_ID density_scatterplot violin_plot multiline_plot ref_to_json_file execute venn barplot scatterplot_2d_color worksheet_to_hash group_bar workbook_to_hash read_table)

但是

say <list_regex_files json_file_to_ref write_2d_array_to_tex_tabular dir get_sample_ID density_scatterplot violin_plot multiline_plot ref_to_json_file execute venn barplot scatterplot_2d_color worksheet_to_hash group_bar workbook_to_hash read_table>.sort

有效。 但是,如何将数据保存到数组中并然后 排序呢?喜欢 say @e.sort?

这是引用结构的问题。

如果我用

my @e = <list_regex_files ...> 而不是 my @e = Q (...)

然后

@e.sort 有效。

回应@Elizabeth 的评论,dd 是你的朋友...

> my @a1 = Q (a b c); dd @a1;   #Array @a1 = ["a b c"]
> my @a2 = <a b c>;   dd @a2;   #Array @a2 = ["a", "b", "c"]

这里是文档https://docs.raku.org/language/quoting,供路过的读者阅读

Q 是引用域特定子语言的基础。

因此它非常简陋,它唯一做的就是原始引用。您甚至无法转义结束分隔符。

say Q (a b c \).raku
# "a b c \"

您可以为该基本语言启用额外的功能,例如启用 :backslash。 (:b是别名)

say Q :backslash (a b c \)).raku
# "a b c )"

您可能认为 :words (:w) 或 :quotewords (:ww) 功能已启用。

say Q :words (a b c).raku
# ("a", "b", "c")

say Q :quotewords (a b 'c d' "e f").raku
# ("a", "b", "c d", "e f")

其中一些功能非常有用,因此有其他方法可以编写它们。

例如 :single (:q) 功能启用反斜杠结束定界符,但通常只用单引号拼写 ' '.

'a b c \' d'    eqv    Q :single 'a b c \' d'    eqv    Q:q 'a b c \' d'

单引号还有一个别名q

'a b c \' d'    eqv    q 'a b c \' d'

还有一个快捷方式,拼写为< >

<a b c>    eqv    Q :single :words (a b c)    eqv    Q:s:w (a b c)

您认为自己使用的是哪个。


您可以启用或禁用更多功能。 For a more comprehensive list and examples see the documentation.

这里有两个问题。首先,如果您坚持使用 Q 引用形式,那么在排序之前您必须 combsplit 您的字符串。其次,不清楚您能否保证您的元素将由一个(且只有一个)空格字符分隔,这意味着您必须自己处理 'variable whitespace':

my @f = Q (list_regex_files   json_file_to_ref write_2d_array_to_tex_tabular   dir get_sample_ID density_scatterplot violin_plot   multiline_plot ref_to_json_file execute venn barplot scatterplot_2d_color worksheet_to_hash group_bar workbook_to_hash read_table); #variable whitespace

say @f.elems; #1
say @f.comb(/ \S+ /).elems; #17 
say @f.split(' ', :skip-empty).elems; #17 with :skip-empty, 23 without
say @f.split(/ <.ws> /, :skip-empty).elems; #17 with skip-empty, 35 without

但是,您想要的结果很容易从 Q:w('quote-word' 引用)开始而不是普通的 Q:

my @g = Q:w (list_regex_files   json_file_to_ref write_2d_array_to_tex_tabular   dir get_sample_ID density_scatterplot violin_plot   multiline_plot ref_to_json_file execute venn barplot scatterplot_2d_color worksheet_to_hash group_bar workbook_to_hash read_table); #variable whitespace

say @g.elems; #17
.raku.put for @g.sort;

输出:

"barplot"
"density_scatterplot"
"dir"
"execute"
"get_sample_ID"
"group_bar"
"json_file_to_ref"
"list_regex_files"
"multiline_plot"
"read_table"
"ref_to_json_file"
"scatterplot_2d_color"
"venn"
"violin_plot"
"workbook_to_hash"
"worksheet_to_hash"
"write_2d_array_to_tex_tabular"

https://docs.raku.org/language/quoting
https://docs.raku.org/routine/split