作者Rnsras (Rnsras)
看板Perl
标题Re: [问题] 请教两个简单的撷取问题...
时间Thu Apr 14 22:11:24 2016
※ 引述《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;
: 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), 来自: 150.117.56.246
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Perl/M.1460643087.A.7D0.html
※ 编辑: Rnsras (150.117.56.246), 04/15/2016 01:44:50