作者CindyLinz (Cindy Wang)
看板Perl
标题Re: [问题] 请教两个简单的撷取问题...
时间Fri Apr 15 15:27:49 2016
※ 引述《Rnsras (Rnsras)》之铭言:
: ※ 引述《loyuchu1539 (爆走原始人)》之铭言:
: : 小弟是Perl 新手 由於工作需要,才开始学习perl 目前预到两个问题
: : 1.撷取文字党片段到一阵列
: : Ex: 文字档(map.txt)如下
: : Jack
: : AA_map 1
: : BB_map 1
: : CC_map 0
: : Michael
: : AA_map 0
: : CC_map 0
: : DD_map 1
: : Ruby
: : DD_map 1
: : EE_map 0
: : .
: : .
: : 请问小弟该如何文字档中的Michael至Ruby中间的三行取出,存至@map 呢?
: 蛮常处理这种状况,抛砖引玉一下,希望有更好的做法可以学 XD
: 我的方法其实蛮直觉的,前提是格式内容要够规律,不然就不适用了;
: 方法就是设一个变数去控制是否开始储存txt的内容,然後如果符合要储存的条件,
: EX: Michael和Ruby中间,就把刚才存的 @temp 丢进去 @map 里面,以下为程式码:
: my $sw = 0; my @map=(); my @temp=();
: open inputF, "map.txt";
: while(<inputF>){
: chomp;
: if($sw==0 && $_ eq "Michael"){
: $sw=1; @temp=();
: }elsif($sw==1 && $_ !~ /^\w+_\w+\s+\d+$/){
: $sw=0; if($_ eq "Ruby"){ push @map, @temp;}
: }elsif($sw==1){
: push @temp, $_;
: }
: }
: close inputF;
我顺便来复习一下 scalar context 的 range operator 的用法..
如果每次执行这程式的时候, 这一段程式只会给一个档案使用的话,
while 的 body 里面的判断可以这样子写
if( $_ eq "Michael" ... $_ eq "Ruby" ){
push @map, $_;
}
或是用 regex 写成
if( /Michael/ ... /Ruby/ ) {
push @map, $_;
}
这样 @map 里面会有 Michael, 中间三行, Ruby, 这样一共五行..
回圈结束後再把 @map 的头尾去掉即可,
然後 $_ eq "Michael" ... $_ eq "Ruby" 这个东东为 true 的这几次依此会 return
1 2 3 4 5E0
如果拿一个变数把它存下来, 判断一下必须
它 > 1 而且 substr(它, -2) ne 'E0'
也可以
: : 2.存一个庞大的文字档案分类至一个hash
: : 以上头的文字档为范例
: : 小弟该如何将这个文字档 以各别名字存为一个hash呢?
: : 例如存成:
: : $hash{Jack} =
: : AA_map 1
: : BB_map 1
: : CC_map 0
: : 另外一问..若从hash内叫出来 想要判断内容,请问各位会如何撰写呢?
: : 比如说 判断$hash{Jack} 内 AA_map 值是否为1 是则print出 AA_map,
: : 若不是,则继续判断BB_Map 是否为1,印出 BB_map 直到判断到某个XX_map 为1为止..
: : 写得有点智障...但希望看得懂得大大能指教一下@@...
: 综合你要储存跟判断,我的做法的话用 reference 的方式把值(AA_map 1)存成 hash,
: 再把它塞进外围的 %hash,这样如果你要知道 Jack 的 AA_map 是 0 还是 1,
: 你可以用 $hash{'Jack'}{'AA_map'} 得到 1,以下为 code (其实只有小改上面的 code)
: my %hash=(); my $name='';
: open inputF, "map.txt";
: while(<inputF>){
: chomp;
: if($_ =~ /^(\w+_\w+)\s+(\d+)$/){
: my %temp = defined($hash{$name})? %{$hash{$name}}:();
: $temp{$1} = $2;
: $hash{$name} = \%temp;
: }else{
: $name = $_;
: }
: }
: close inputF;
: 希望有帮助到原PO ^_^
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 112.121.78.5
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Perl/M.1460705270.A.1A2.html
※ 编辑: CindyLinz (112.121.78.5), 04/15/2016 15:28:47
2F:→ CindyLinz: 不过我那时 .. 和 ... 好像有讲反, 请自己试一下 ._. 04/15 15:39
3F:推 Rnsras: 哦哦哦,原来还有这种用法!受教惹!! 04/15 22:40
4F:推 herculus6502: 赞一个 04/28 22:58