associative – Perl 6可以将%sigil用于除Hash之外的其他东西吗?

关于变量的Perl 6文档指出%sigil可以与执行 Associative角色的类型一起使用.它特别提到了 Pair,HashMap.但是,我如何将 Pair变成带有%的变量?

如果我使用类型约束,我会得到一个奇怪的错误

> my Pair %pair = Pair.new( 'a','b' )
Type check Failed in assignment to %pair; expected Pair but got Str ("b")
  in block <unit> at <unkNown file> line 1

如果我分配没有类型约束我得到一个哈希:

my %pair = Pair.new: 'a','b';  # Hash,not Pair

装订工程:

my %pair := Pair.new: 'a','b';  # Pair

但是,如果我使用类型约束,我会得到另一个奇怪的错误

> my Pair %p2 := Pair.new: 'a','b';
Type check Failed in binding; expected Associative[Pair] but got Pair (:a("b"))
  in block <unit> at <unkNown file> line 1

同样的问题出现在BagSet上.用Map做,你最终得到了一个可变的Hash.

我认为这里有各种各样的问题,但也许%sigil并不像我所认为的那样多才多艺.

解决方法

您可以使用%sigiled容器来保存执行 Associative角色的任何值.

正如您所发现的那样,您必须小心如何申报和分配.

在你的例子中,我的配对%对,你说要做一个可以保持配对值的哈希(不是一对)(%pair.WHAT =’哈希[配对]’)

试试这个:

my Pair %p2 = mykey => Pair.new: 'a','b';

这可能很好.通过约束值的类型,如果你说,你会得到一个错误

%p2<c> = 'd';

因为你没有分配一对.

正如您所发现的那样,绑定以您认为应该的方式工作.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...