perl6 学习笔记 - (数据相关)
hitsubunnu
|
1#
hitsubunnu 发表于 2008-11-18 14:27
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存在返回真 |