函数定义Perl6 在定义函数时,显示了参数,这是非常灵活的。因为它不会对参数做任何默认的处理,程序会全部传给您来进行处理,并增加返回值关键字 return,,这点更像 c 语言定义函数,如:
函数定义sub mysub ( $x ) { My $y = $x/2; Return $y;}除此之外,还允许定义可选参数及参数默认值,对于可选参数需要在参数后加?, 对于定义参数默认值则直接在参数后直接加 = defaultvalue,如:
参数设置sub mysub($first, $second?,$third = 4);这里参数$second 是可选参数,默认值为 undef,而参数$third 是必填参数,且默认值为 4。
重载Perl 6 还允许定义相同名字的函数,但需要参数不同,并需要加上 multi 关键字,如:
函数重载multi sub double(Int $x) {my $y = $x * 2;say “Doubling an Integer $x: $y”;return $x * 2;} multi sub double(Num $x) {my $y = $x * 2;say “Doubling a Number $x: $y”;return $x * 2;} my $foo = double(5); # Doubling an Integer 5: 10my $bar = double(3.5); # Doubling a Number 3.5: 7块和闭包在 Perl5 中,想要访问不同范围内的变量,只能通过 my、our、local 来定义变量的作用范围,而 Perl6 通过增加$OUTER 和$CALLER 使访问变量更加灵活,这里对于一个代码块来说使用$OUTER 找到上一层范围同命名的变量, 如:
$OUTER 使用my $x = 5;{ my $x = 6; say $x; # 6 say $OUTER::x # 5}对于函数来说,使用的是$CALLER 来找到对应的变量,如:
$CALLER 使用my $x = 5;mySubroutine(7); sub mySubroutine($x) { say $x; # 7 say $CALLER::x; # 5}类定义Perl6 拥有了真正概念上的类和对象,公有变量可以使用符号,私有变量使用符号!, 并将以前的方法调用符->变为.,如:
类定义class MyClass { has $!private; has @.public; # and with write accessor has $.stuff is rw; method bark { if self.can(‘bark’) { say “Something doggy”; } }}以上代码中,使用一个 class 的关键字定义类。如果您有学过 Perl5 的话,您能想到这有点像包(package)的变种。接下来,使用 has 的关键字来声明属性访问器方法。这个"."的东西名叫 twigil.。Twigil 是用来告诉您指定变量的作用域。它是"属性 + 存取方法"的组合。接下来是方法的使用,并介绍使用 method 的关键字。在对象中的方法像包中的子函数,不同之处在于方法是放在类的方法列表的条目中。它还能自动取得调用者(invocant),所以您如果没有在参数列表中加入参数,它是会给自我传递过去,在 Perl 5 中需要我们显示的写 $self = shift。
对于以前在 Perl5 中使用的大部分函数都已经转换为方法,如得到字符串长度,调用 chars 方法:My $len = $string.chars 和排序数组,调用 sort 方法:Print @array.sort ;
构造函数Perl5 的构造函数是类的子程序,它返回与类名相关的一个引用,将类名与引用相结合称为 bless 一个对象。Perl6 所有的类都使用名叫 new 的默认的构造器,它会自动的映射命名参数到属性,所有传进的参数会存到属性中,如:
构造函数my $comer = family.new(name => 'Jack', age=>23); say $fido.name; # Jack继承Perl6 的继承直接使用 is+父类名就可以,如:
继承class MySubClass is MyClass { method bark { say “Something wow!”; }}小结我们将以上内容总结对比为如下表:
Perl6 与 Perl5 对比一览表类别Perl6Perl5命令运行支持交互不支持交互数组定义@a = “hello”, “world”;@a = (“hello”, “world”;)哈希定义%a = “first” => 1, “second” => 2; or
%a = :first(1),:second(2);%a = (“first” => 1, “second” => 2);哈希访问%a{“first”} or %a<first>$a{“first”}字符拼接“hello “ ~ “ world”“hello”.”world”匹配“c” ~~/c/“c” =~/c/数据类型Bool, Array, Int, Num, Pair,Complex, Str 等Scalar, Array, Hash控制结构given/when 无forforeachloopforrepeat/whilewhile函数重载参数不同,并需要加上 multi 关键字无变量作用域my, our, local, $OUTER, $CALLERmy , our, local类定义使用 class,支持公有变量和私有变量使用 package构造函数new()引用+bless()方法调用使用.使用->继承is 父类名(使用的是 class)use 父类名(使用的是 package) |