- 论坛徽章:
- 0
|
- 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存在返回真
复制代码 |
|