perl6 学习笔记 - (数据相关)

perl6 学习笔记 - (数据相关)



[Copy to clipboard] [ - ]
CODE:
Perl6 入门学习笔记

一 动手试验环境 pugs
1.pugs 下载
        [url]http://www.jnthn.net/perl6/pugs-win32.zip[/url]

2.pugs 安装
        需要安装 perl5.8
        解压缩后即可使用(windows环境)

3.pugs环境测试
       
        命令行:
        cd c:\pugs
        c:\pugs>pugs.exe
        c:\pugs>say “hello pugs!\n”;
  
        执行文件:
        pugs hell.p6   # 注意文件后缀为 .p6
       
可参照 [url]http://www.programmersheaven.com/2/Perl6-QuickStart[/url]

二 数据
I. 字符串
1.定义
        my $str1 = "this is a";
        my $str2 = "$str1 pig"; #运行结果 this is a pig
        my $str3 = '$str1 pig'; #运行结果 $str1 pig
       
2. qq q 等的使用
        my $str1 = qq(this is a);
        my $str2 = qq($str1 pig); #运行结果 this is a pig
        my $str3 = q($str1 pig);  #运行结果 $str1 pig
       
3. {}的使用
        my $str1 = "{1 + 1}";  # 结果是2 不是{1+1}
       
II. 列表
1.定义
        my @list1 = ("123","abc","1a3");
        my @list2 = ("A".."Z"); # ABCD..Z 从A到Z
        my @list3 = (1..100);   # 从1到100
       
2.字符串列表
        my @list = qw(123 abc ddd);
        my @list = <123 abc ddd>;   # 新的标记法 功能相同
       
III. 数组
1. 定义
        my @array;
        my @array = ("123","abc","1a3");
        my @array = qw(123 abc ddd);
        my @array = <123 abc ddd>;
       
2. 赋值
        my @array[0] = 1;  # 注意不是$array[0]
        my $value = @array[0];
        my $value = @array.[0];
       
        slice的使用
        my @values = @array[2,0,1]; #元素位置交换
       
        my @values = ( @array[2], @array[0], @array[1] ); # 相同写法
       
        my @values = @array[(2, 0, 1)]; # 相同写法
       
        my @slice = (2, 0, 1);
        my @values = @array[@slice];  # 相同写法
       
3. 数组的方法 (.操作符)
       
        3.1 延续Perl5的方法  shift unshift pop push splice join
        @array.shift; #新的写法
        shift @array; #相同
       
        3.2 grep map 不变
       
        3.3 新的可用方法
       
                @array.keys();      # 取得数组的下标
                @array.values();    # 取得数组的值
                @array.kv();         # 下标和值一起取得 可以理解为hash的each
                @array.elems();      # 元素个数
                @array.exists(num);  # 指定下标数存在返回真 不存在返回假
                @array.delete(num); # 删除指定下标元素 复数可
                @array.max();                 # 最大值
                @array.min();                 # 最小值
                                                               
                my @array = <a b c d e>;
                say @array.keys();     # 01234
                say @array.values();   # abcde
                say @array.kv();        # 0a1b2c3d4e
                say @array.elems();     # 5
                say @array.exists(4);   # 1 如果say @array.exists(6);结果为假
                say @array.delete(1,3);# 删除元素b和d  数组只剩下元素ace
               
        3.4 需要特殊注意新的可用方法       
               
                3.4.1 @array.pick(num);   # 随即取出数组中的不重复元素  类似于rand函数(rand可能取得重复的)
               
                my @array = <a b c d e>;
                say @array.pick(5);                # 结果例 eabdc 注意:不会重复
                say @array.pick(*);                # * 代表全部元素
                扩展
                my @array = <z z>;
                say @array.pick(2); # ("z", "z")
                say @array.pick(3); # ("z", "z")
                say @array.pick(3,:repl); # ("z", "z", "z") :repl 取消限制  注意pugs测试未通过
               
                ——————————————————————————————————————————————————————————————————————————————
               
                3.4.2 @array.first(block); # 返回最初的block中为真的值
               
                my @array = (1 .. 10);
                my $result = @array.first( { ($_ == 4) } ); # 4 注意pugs测试未通过
               
                ———————————————————————————————————————————————————————————————————————————————
               
                3.4.3 reduce(block, @array);# 简化操作 # 相当于定义一个规则 根据这个规则进行类推计算
               
                my @array = <1 3 5 7>;
                say reduce { $^a + $^b }, @array; # 16
                #第一步 先将 1 和 3 看作是  $^a 和 $^b 计算结果为 1+3=4
                #第二步 将1和3的结果4看做是 $^a 将下一项 5看做是$^b 再进行计算 4 + 5 = 9  以此类推
               
                # 相当于定义一个规则 根据这个规则进行类推计算
                reduce { $^a + $^b + $^c }, @array;
               
IV. 范围类型 (range)  # 不知道应该叫什么 大骆驼里面把 .. 叫做范围操作符 暂且叫做范围类型吧
1.        定义                #个人观点 因为带有$符号 可以理解为带有方法的特殊字符串
        my $range = 1 .. 5;     
        my $range = "a" .. "c";

    my @array = $range; # 可以给数组初始化
       
2.        方法
        延续perl5的方法:
                $range.shift();
                $range.pop();
                $range.reverse();
               
V.        pair类型         
1.        定义  
       
        简单理解就是 散列的一行数据    #个人观点 因为使用$符号 也可以理解为带有方法的特殊字符串
       
        my $pair = "key" => "value";
        my $pair = :key<value>;                 #相同
       
        用法:
        my $pair = (:key);
        my $pair = ("key" => 1); # 同じこと
       
        my $pair = "key" => ("value-key" => "value-value");
        say $pair.value.key;         # 结果 value-key  值的key
        say $pair.value.value;  # 结果 value-value  值的值

        my $pair = ("key-key" => "key-value") => "value";
        say $pair.key.key;         # 结果 key-key  key的key
        say $pair.key.value; # 结果 key-value  key的值
       
        和hash的关系:
        my %hash  = ('key1' => 'value1',
                                 'key2' => 'value2',
                                 'key3' => 'value3',       
                                );
        my $pair = %hash.pairs().[0];
        say $pair;    #  key1 value1
       
2.  给key 和 value 赋值

        my $pair = ("key" => "value");
        $pair.value = "newvalue";
        $pair.key   = "newkey";
       
3.  方法

        $pair.key();
        $pair.value();
       
        $pair.kv(); # 与hash里的each类似
        my ($key, $value) = $pair.kv();
       
VI        散列
1.        定义
        # 注意 my %hash = ( key => value );  缺少引号在pugs下不合法  可以采用 my %hash = <key value>;
        my %hash = ( "key" => "value" );  
        my %hash = ( 'key' => 'value' );
        my %hash = hash("key", "value");  #相同
               
        my $pair = ( "key" => "value" );  #新用法
        my %hash = $pair;
       
2.        赋值
        my %hash{'key'} = 'value';    # 注意这里是 %hash{'key'}  不是 $hash{'key'}
        my %hash<key>  = "value";          # %hash<key> 合法    %hash{key} 在perl6下是不合法的
               
        my $value = %hash{"foo"};
        my $value = %hash<foo>;
       
        my $value = %hash.{"foo"};
        my $value = %hash.<foo>;
       
        my @values1 = %hash{"foo", "hoge"};
        my @values2 = %hash<foo hoge>;
       
3.  方法
       
        3.1 hash()
         
        my %hash = hash("foo"  => "bar");  #
        my $hash = hash("hoge" => "fuga"); # 注意 这是一个引用
       
        3.2 参照数组的方法
       
        %hash.keys();
        %hash.values();
        %hash.kv();
        %hash.pairs();

        %hash.elems();      # key的个数
        %hash.delete("key");# 删除指定key
        %hash.exists("key");# 指定key存在返回真



[Copy to clipboard] [ - ]
CODE:
三 控制结构

I.        for        的几种使用方法
       
        1.        列表
                for "123", "abc", "000" {
                    say $_;
                }
       
                用例:
                for <111 abb ccc> {
                           say $_;
                }

                for @array {
                    say $_;
                }

                for 0 .. 5 {
                    say $_;
                }
       
        2.  定义变量
       
                for "123", "abc", "000" -> $str{
                    say $str;
                }
               
                for "111", "222", "333", "444" -> $x, $y {    # 注意  列表个数必须是变量个数的倍数 即能整除
                    say $x, " and ", $y;
                }
               
               
                for "111", "222", "333" -> $x, $y, $z {              # 注意  列表个数必须是变量个数的倍数 即能整除   
                    say $x, " and ", $y " and ", $z;
                }
                               
II. loop 用法  相当于C语言中的for语句
       
        1.        my $i = 0;
                loop ($i = 0; $i < 10; $i++) {
                    say $i;
                }

        2.  loop (my $i = 0; $i < 10; $i++) {
                    say $i;
                }

        3.  my $i = 0;
                loop {
                    $i++;
                    last if $i == 1000;
                }

III. while用法
       
        1.  my $i = 0;
                while ($i < 5) {
                    say $i;
                    $i++;
                };


        2.  my @array = 1..5;
                while @array.pop -> $x {
                    say $x;
                }       

更多的用法和特性可以参照   http://svn.pugscode.org/pugs/t/spec/

有了这些  可以开始用perl6 干很多事情了

perl6不错   期待
perl 6什么时候可以出来呀,百度和谷歌都搜不到
有个专门讲perl5-perl6的blog
http://perlgeek.de/blog-en/

可惜我现在perl5都没有学好
懒得学perl6