Perl 5 和 Perl 6(现称为 Raku)在 Sigils(符号标记)的使用上有显著差异。以下是主要对比:
Perl 5 的 Sigils
基于变量类型:
$ 表示标量(scalar)
@ 表示数组(array)
% 表示哈希(hash)
& 表示子程序(subroutine)(通常可省略)
* 表示类型通配(typeglob)
访问元素时需切换 Sigil:
my @array = (1, 2, 3);
my $first = $array[0]; # 访问数组元素时用 $ 而非 @
my %hash = (a => 1, b => 2);
my $value = $hash{a}; # 访问哈希元素时用 $ 而非 %
上下文敏感:
my $count = @array; # 在标量上下文中,@array 返回长度
Raku(Perl 6)的 Sigils
基于变量类型 + 不可变性标记:
$ 表示标量(任何值,包括对象)
@ 表示 位置化(positional,如数组)
% 表示 关联化(associative,如哈希)
& 表示可调用对象(callable)
- 新增
: 用于副词(adverbs)
访问元素时 Sigil 不变:
my @array = 1, 2, 3;
my $first = @array[0]; # Sigil 不变,仍用 @
my %hash = a => 1, b => 2;
my $value = %hash<a>; # Sigil 不变,仍用 %
Twigil(二级符号):
- 双符号标记,如
$*var(动态作用域)、$^var(占位参数)等。say $*CWD; # 动态变量:当前工作目录
更一致的语法:
关键差异总结
| 特性 |
Perl 5 |
Raku(Perl 6) |
|---|
| 访问元素 |
切换 Sigil($array[0]) |
Sigil 不变(@array[0]) |
| 切片 |
用 @(@array[0..2]) |
用 @(@array[0..2]) |
| 哈希键 |
用 $($hash{key}) |
用 %(%hash{key}) |
| 上下文 |
隐式上下文转换 |
显式方法(.elems 等) |
| 新特性 |
无 Twigil |
支持 Twigil($*var 等) |
设计理念
- Perl 5:Sigil 代表数据的存储类型,访问方式随操作变化。
- Raku:Sigil 代表变量的 接口角色(
@ 可索引,% 可键控),更面向对象且语法一致。
示例对比
# Perl 5
my @arr = (1, 2, 3);
my %hash = (a => 10);
say $arr[0]; # 1
say $hash{a}; # 10
say scalar @arr; # 3
# Raku
my @arr = 1, 2, 3;
my %hash = a => 10;
say @arr[0]; # 1
say %hash<a>; # 10
say @arr.elems; # 3(显式方法)
结论
Raku 的 Sigil 系统更一致且可预测,减少了上下文歧义,但增加了新概念(如 Twigil)。Perl 5 的 Sigil 切换对初学者可能造成困惑,但长期用户已习惯其上下文敏感性。两者都保持了 Sigil 提供变量类型信息的核心思想,但 Raku 将其发展为更系统的语法角色标记。