第288页 高级Perl技巧
Sky (好好读书,认真笔记!)
- 章节名:高级Perl技巧
- 页码:第288页
切片——slice 引自 高级Perl技巧 获取数组中少量数据的最简单方法,下面代码是通过不同的方式实现获取并处理借书证和借阅数量实现。
# 文件中存储了读者信息:姓名、借书证、住址、家庭电话、工作电话、当前借阅数量 fred flintstone:2168:301 Cobblestone Way:555-1212:555-2121:3 barney rubble:709918:3128 Granite Blvd:555-3333:555-3438:0 # 最直观的 while (<$fh>){ chomp; my @items = split /:/; my($card_num,$count) = ($items[1],$items[5]); ... # use the two variables. } # 上面使用了@items数组被认为是一种浪费,改进为使用一组标量。 my($name,$card_num,$addr,$home,$work,$count) = split /:/; # 除了$card_num和$count之外,其他的变量都不适用,赋值了也被认为是浪费,于是再改进如下 my(undef,$card_num,undef,undef,undef,$count) = split /:/; # 一旦上面的undef多放了一个或者少放了一个,都有可能造成$card_num和$count的值不对 # 所以引入list slice,通过类似数组下标的方式获得数据 my $mtime = (stat $some_file)[9]; # stat外围的括号是必须的,用于产生列表上下文,如果写成这样就不对了:my $mtime = stat ($some_file)[9]; # 回到上面的例子,使用list slice应该是这样的 my $card_num = (split /:/)[1]; my $count = (split /:/)[5]; # 但上面的写法没取得这两个变量时,都需要执行两次split,性能不高,写法上也稍显啰嗦 my($card_num,$count) = (split /:/)[1,5]; # 一次切片成型的写法。 # 借助数组索引中的特殊表示方法,可以用下面的方式获得列表中的第一个和最后一个元素 my($first,$last) = (sort @names)[0,-1]; # 切片的下表顺序可以任意,也可以重复 my @numbers = (@names)[9,0,2,1,0]; # 注意,这里可以看出来,即使是数组本身,外面也套上小括号了。 # 上面最后一个例子,其实可以去掉@names外面的括号,也就引出了数组切片——array slice. my @numbers = @names[9,0,2,1,0]; # 这里需要注意一下数组的两种获取内容的方式:@names[1,5]和(@names[1],@names[5])其实是同一回事。哈希切片 引自 高级Perl技巧 对比前面数组切片的写法,哈希切片非常类似,@+哈希名+大括号(数组切片是:@+数组名+中括号)
# %scores是之前的保龄球积分hash my @three_scores = ($scores{'fred'}, $scores{'dino'}, $scores{'barney'}); # 传统写法 my @three_scores = @scores{ qw/fred dino barney/ }; # hash slice # 上面之所以没用%是因为他表示整个hash,但是hash slice和核心是slice,不是hash! # 下面是比较简洁的一个hash slice的例子 my @players = qw/ barney fred dino /; my @bowling_scores = ( 195,205,30 ); @scores{@players} = @bowling_scores;另外,上面提到的数组列表和哈希列表都可以进行字符串的内插。
69人阅读
Sky对本书的所有笔记 · · · · · ·
-
第281页 通过文件句柄执行外部进程
前面提到的方法,全部是同步(阻塞式)的执行外部进程,通过文件句柄(管道式打开),可以达...
-
第283页 用fork进行深入和复杂的工作
没看明白。。。后面再深入。。。 发送及接收信号 发送信号和Unix下标准的kill很类似 kill 2, ...
-
第288页 高级Perl技巧
-
第294页 捕获错误
用eval eval的效果看上去有点像Java中的try块,不过他只是一个表达式,而不是类似于while或fo...
-
第300页 用grep筛选列表
基本形式:grep+{}代码块+列表。 这样,grep会使用列表中的每个元素来运算代码块内的内容。 #...
> 查看全部94篇
说明 · · · · · ·
表示其中内容是对原文的摘抄