Perl 5 和 Perl 6(现称为 Raku)在 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 返回长度
基于变量类型 + 不可变性标记:
$ 表示标量(任何值,包括对象)@ 表示 位置化(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; # 动态变量:当前工作目录
更一致的语法:
my @slice = @array[0..2];
my %slice = %hash<a b>;
| 特性 | 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
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 将其发展为更系统的语法角色标记。