欢迎光临汕头市分类吧
详情描述

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;               # 动态变量:当前工作目录

更一致的语法

  • 切片访问保持 Sigil 一致:
    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: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 将其发展为更系统的语法角色标记。