技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 其他 --> 译文:在 Perl6 中相对于 Perl5 几个非常可喜的变化

译文:在 Perl6 中相对于 Perl5 几个非常可喜的变化

浏览:1716次  出处信息

注: 译文 JimmyZ 所推荐的  Perl 6 的一个 blog .相当不错的文章,所以译过来和大家一起分享.
原文链接:http://stevieb-tech.blogspot.de/2012/04/use-perl6-my-first-experience-with.html

我已经使用 Perl 编程的10年了,我已经听说了非常多的关于 Perl6 的东西。这是一些非常热爱它的人,有谁不喜欢吗?(恐惧)。对于我来说,我一直想进一步了解它,但从来没有时间。不要误会,我绝对爱 Perl5 中,并一直会使用它,直到我们到了一天,使用这个达到现在相同的水平,我会让老的代码慢慢逐渐消失。

过去几周我一直在看 Perl6 链接中有关 moritz's PerlMonks下面这里有一些非常有趣的差异迄今来所发现

在这篇文章中,我接触到一些东西如 strictsigils什么是变量对象和方法,类型还有一些控制结构.我会介绍变化相关基本知识然后看看新的语言中更先进的方面当你认为足够好用可以努力给你的应用从 Perl 5 转换 Perl 6.

STRICT

开箱即用,一个不错的功能strict 的严格检查是默认启用的.

1
2
3
4
% cat no_strict.pl
  
#!/home/steve/perl6/perl6
say $hello;

输出:

1
2
3
4
5
% ./no_strict.pl
  
===SORRY!===
Variable $hello is not declared
at ./no_strict.pl:2

SIGILS

Perl6变量记得本身的 sigils ,不管怎么样操作和执行什么在 Perl5 中要访问数组元素哈希你必须使用标量印记(Perl 5 )来指出你打算访问其中的元素(ps 和 PHP 很象了,会学习起来更加容易):

Perl 5 的方法:

1
2
3
4
5
my @a = qw( 1, 2, 3 );
say $a[0];
  
my %h = ( key => 'value' );
say $h{ 'key' };

但在 Perl6 中:

1
2
3
4
5
my @a = 1, 2, 3;
say @a[0];
  
my %h = 'key' => 'value';
say %h{ 'key' };

数组部分的代码和我们想象的一样是正常的.当我们访问的哈希的值时,Perl6哈希的键要用引号引起来才会自动引用其值 .不然这个时候,其实他会调用子函数,这时会调用 sub key ().但我感觉,这时我们如果要创建功能调度表会快很多.
通过某个键访问的哈希值的正确方法使用引号给键引起来.也可以象下面这样的

1
2
3
4
5
6
7
# the old faithful
  
say %h{ 'key' };
  
# or the new auto-quote syntax
  
say %h< key >;

变量是面象对象的(也有方法

这里几个例子是有关变量动作所新加的变量对象的方法,其它相应的Perl 5的语法(仍然Perl6 中可用)首先展示数组的几个例子然后哈希还值得一提有关括号数组元素不足就是少了 qw() 函数

变量的方法,数组

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
my @a = 2, 3, 1;
  
# number of array elements
  
say @a.elems;
say scalar @a;
  
# sort array
  
say @a.sort;
say sort @a;
  
# map array
  
say @a.map({ $_ + 10 });
say map { $_ + 10, ' ' } @a;
  
# or even
  
say @a.sort.map({ $_ + 10 });
say map { $_ + 10, ' ' } sort @a;

我们可以发现一些不同,在 Perl 5 中:

1
2
perl -E 'my @a=qw( 1 2 3 ); my $x=@a; say $x'
3

但在 Perl6:

1
2
perl6 -e 'my @a=1,2,3; my $x=@a; say $x'
1 2 3

但是,我们还是可以使用数组来进行计算数组元素的个数的数字比较

1
2
perl6 -e 'my @a=1,2,3; say "ok" if @a == 3'
ok

哈希Perl 5 的语法接近

01
02
03
04
05
06
07
08
09
10
11
12
my %h = z => 26, b => 5, c => 2, a => 9;
  
say %h.keys;
say $_ for keys %h;
# could also be written as:
say keys %h; # but the spacing is different in 5
  
say %h.values;
say $_ for values %h;
  
say %h.keys.sort;
say $_ for sort keys %h;

注:大多数变量对象的方法也仍然作为函数因此下面是等价的

say %h.keys;
say keys %h;

 

一切是一个对象都有一个类型(可以受到限制-可选

下面是一个简单明了的例子解析所谓一切都是对象都有类型.我会使用一些 Perl6 的语法来尝试着下,这会让我们很惊讶它是如何工作的这个 WHAT() 的方法调用的时候,会得到这个东西的类型.

1
2
3
4
5
# calling methods on literals w00t! <IMG class=wp-smiley alt=:) src="http://www.php-oa.com/wp-includes/images/smilies/icon_smile.gif"> 
  
say 25.WHAT;
say 'string'.WHAT;
say (1,2,3).WHAT;

输出:

1
2
3
Int()
Str()
Parcel()

我们可以很方便的做类型的检查:

1
2
3
4
5
my $quote = "I am liking Perl6";
  
if $quote ~~ Str {
    say "it's a string";
}

注意括号, 这时在 IF() 条件中,变得非常的短小了.现在,是这样也可以使用的也有陷阱所以建议您不要使用它们

约束某些变量的类型也很容易

1
2
3
4
5
# define $x as an Int
my Int $x = 5;
  
# try to assign it a string
$x = "Hello, world!";

输出:

1
2
Type check failed in assignment to '$x'; expected 'Int' but got 'Str'
  in block  at ./types.pl:15

在 Perl 6 中的类型是一个有着继承层次的结构,但不太熟悉如果了解更多,我会更新这篇文章例如,int是 Numeric
 

控制结构

我在上面简要介绍了使用 if 语句(不使用括号)看这个例子:

1
2
3
4
my $x = 5;
if ($x < 10){
    # do stuff
}

Perl6为了防止失误完全省略括号这里有一些有趣的变化,这其实是告诉你,它尝试调用'一个函数名'为 "if".象 if, while, for 都这样.

在 Perl 5 中在大多数情况下,我们会给要使用的元素命名成词法变量,象下面这样for 循环中的 $elem

1
for my $elem ( @a ){ say $elem; }

Perl6避免使用$_,,我们使用 -> ("pointy block"):

1
for @a -> $elem { say $elem; }

我确认我上面的 Perl 5 的 for() 代码在我的眼中是没有问题的.但如果我在 Perl 6 中执行这样的写法,没使用后面这种典型的用法的话. Perl 6 会给出如下的提示.

1
2
3
===SORRY!===
This appears to be Perl 5 code
at ./control.pl:15

 在 Perl 6 中,非常的形象,它看起来尖尖在向前移另一个有关 for() 的需要注意.现在只能用于列表 perl6 对于C风格的for循环,有一个分开loop() 结构

另外,可以使用一个以上的循环变量

1
2
3
for @a -> $first, $second, $third {
    say "$first, $second, $third: I'm greedy on each iteration!";
}

遍历哈希

1
2
3
for %h.kv -> $k, $v {
    say "$k :: $v"
}

20120405

建议继续学习:

  1. perl更新/修改/删除文本文件内容    (阅读:9491)
  2. perl大牛flw传说    (阅读:6529)
  3. perl模块Getopt::Std用法及实例-从命令行读取参数模块    (阅读:5947)
  4. [Perl] Template::Toolkit 模板技术.    (阅读:5387)
  5. 在perl中连接和使用sqlite做数据存储    (阅读:5118)
  6. Perl命令行常见用法及技巧    (阅读:4874)
  7. perl模块之MIME::Lite发送有附件的邮件    (阅读:4463)
  8. perl的expect使用方法,实现非交互式登录。    (阅读:4552)
  9. Perl 倒行分析文件方法。perl读文本文件,从末尾往前读.    (阅读:4503)
  10. perl大牛唐凤传说    (阅读:4290)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1