作者flu (Crazy Rhythm)
看板Perl
标题Re: [问题] 读取档案的内容
时间Fri Nov 2 19:33:11 2012
use Data::Dumper ;
my %count_of_si ;
#统计si出现的次数
my %p_of_si ;
#统计si为0的次数
my $raw_read_in ;
while($raw_read_in = <>){
#样式比对 把该行内首先出现的,被space or tab 分隔的两组数字放入list内
#样式最後的x代表空格会被忽略
my @filtered
= ( $raw_read_in =~ m/^ [\s\t]* (
\d+) [\s\t]+ (
\d+) /
x ) ;
#如果比对失败 @filtered的内容为 undef, 进入下轮回圈
next if ( !defined $filtered[0] ) ;
#首次执行到这里时@filtered内为(0,1) , $count_of_si{1} == undef,
#执行完这一行 $count_of_si{1}==1
$count_of_si{ $filtered[1] }++ ;
#类推
$p_of_si{ $filtered[1] }++ if $filtered[0] == 0 ;
}
print Dumper( @count_of_si{ sort keys %count_of_si } ) ;
print "\n" ;
print Dumper( @p_of_si{ sort keys %p_of_si} ) ;
__END__
顺便说一下, eq, lt, gt是拿来作字串比对用的
==, <, > 才是拿来作数字比对用的
有不恰当的地方还请指正喔~
※ 引述《hws110 ( only you )》之铭言:
: 大家好
: 小弟最近在用perl去读取档案并取值
: 档案的内容是这样
: 0 1
: 0 2
: 0 3
: 0 4
: 1 1
: 0 2
: 2 3
: 1 4
: 0 1
: 1 2
: 右边的1、2、3、4是代号
: 左边的数字则是得到的资料
: 我的程式是将1、2、3、4的资料统计出来
: 例如说0有几个,1有几个,2有几个这样
: 我的写法如下
: -----------------
: if ($si eq 1)
: {
: $si_1++;
: if ($sb eq 0)
: { $si1_p++; }
: }
: if ($si eq 2)
: {
: $si_2++;
: if ($sb eq 0)
: { $si2_p++; }
: }
: if ($si eq 3)
: {
: $si_3++;
: if ($sb eq 0)
: { $si3_p++; }
: }
: if ($si eq 4)
: {
: $si_4++;
: if ($sb eq 0)
: { $si4_p++; }
: }
: -----------------------
: $si表示右边的代号1、2、3、4
: $sb表示左边的资料
: 当$si=1时,代号1的数量+1,如果$sb=0,$si1_p就+1,
: 以此来计算共有几个代号1,并其中有几个0
: 代号2、3、4以此类推
: 但是现在有个问题
: 就是档案内容会有变动
: 右边那列有可能会是代号1到2或者代号1到8的变化
: 我想让代号1~2或者1~8的变化都可以通用
: 有没有什麽写法,可以不管代号有几个
: 都可以达到我的需求呢?
: 还请大家不吝指教
: 感谢~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 36.234.222.61
1F:推 hws110:感谢您的回答,我会再试试看^^~感谢您 11/02 21:06