Perl求中值

Perl求中值,第1张

概述先就按这个标题了吧,其实是求数据的中值,如果不合适请大家见谅 参考数据,感谢网友提供的资料 http://perldoc.perl.org/perllol.html http://blog.sina.com.cn/s/blog_5f8e03960100wq3r.html 大晚上的,闲来无事,碰巧遇到一批数据需要处理,就拿学习中的Perl来练手了。 程序想要实现的功能本来挺简单的,可由于水平限制,还

先就按这个标题了吧,其实是求数据的中值,如果不合适请大家见谅

参考数据,感谢网友提供的资料

http://perldoc.perl.org/perllol.HTML
http://blog.sina.com.cn/s/blog_5f8e03960100wq3r.HTML

大晚上的,闲来无事,碰巧遇到一批数据需要处理,就拿学习中的Perl来练手了。

程序想要实现的功能本来挺简单的,可由于水平限制,还是折腾了几个小时。

感觉自己还是花了精力和时间,发博文来给大家分享。欢迎批评指正。

源码中注释不明的地方,请留言指出,谢谢!

万语千言,不敌一张图
本程序想要实现的功能,见图1
注1:算中值,比如,'p001'的中值
注2:第一行就是程序中的‘说明行’示例


程序源码如下(参考资料已在博文前面注明,源码是本人自己写的,如果有小部分与网上相同,这个是不能避免的小概率事件)

#!usr/bin/perl -wuse strict;use 5.014; # 更改为你的Perl版本### powered by Nan Zhou .AT. Sichuan university### version 0.0.1### last update 01/18/13dIE "Usage: perl mIDpoint.pl fileInname fileOutname" unless scalar @ARGV == 2;open IN,"<",$ARGV[0] or dIE "read file error\n";open OUT,">",$ARGV[1] or dIE "out file error\n";print "Is the first line introduction line?(Yes/No) ";  # 你文件中的第一行是说明行么chomp(my $check=<STDIN>);my @aoa_all=();  # 建立二维数组,用以存放原文件所有信息while(<IN>){	chomp;	if('Yes' =~ /$check/i){ #第一行是说明行,先输出到文件,剩下的行用来放到二维数组		say OUT;		$check = 'No';		next;	}	my @tmp_line=split /\t/;	push @aoa_all,[@tmp_line];}# 数组初始化完成,这是一个X行,Y列的二维数组my $cols_index=$#{$aoa_all[0]}; # 注意:是Y列的下标,不是元素个数。方便后面按*列*处理数据# my $cols=$cols_index+1;for my $index_of_aoa (0 .. $#aoa_all){  # 从二维数组首行到末行	next if $aoa_all[$index_of_aoa][0] eq 'Done';  # 'Done'是用来作为标记的,防止重复处理已处理的	my @lines_index_record=$index_of_aoa; # 比如首行首元素为'p001',找到所有其他首元素为'p001'的行号,并记录	for my $re_index_of_aoa ($index_of_aoa+1 .. $#aoa_all){		next if $aoa_all[$re_index_of_aoa][0] eq 'Done';		if ($aoa_all[$re_index_of_aoa][0] eq $aoa_all[$index_of_aoa][0]){			push @lines_index_record,$re_index_of_aoa if $aoa_all[$re_index_of_aoa][0] eq $aoa_all[$index_of_aoa][0];			$aoa_all[$re_index_of_aoa][0]='Done';		}	}	# 寻找行完成。比如,所有首元素为'p001'的行索引都找到并记录了	print OUT "$aoa_all[$index_of_aoa][0]\t"; # 输出标记。比如输出'p001',下面接着在后面输出'p001'的值,其实就是为了方便查看	for my $cur_col (1 .. $cols_index){ # loop all cols. Note,it's 1,not 0,cause col 0 isn't value		my @col_values=(); # 比如,已经找到了'p001'的行索引,按列处理,保存某行所有列值到数组		#for my $cur_line (@lines_index_record){ # 符合条件的列,比如'p001'		#	push @col_values,$aoa_all[$cur_line][$cur_col]; # 在二维数组中去某行某列的值		#}		map { push @col_values,$aoa_all[$_][$cur_col] } @lines_index_record; # 上面取值的另外一种实现方式				# 算中值		my $mIDpoint=-100;		my @sort_col_values=sort { $a <=> $b } @col_values;		if(@col_values%2==0){			$mIDpoint=($sort_col_values[@col_values/2-1]+$sort_col_values[@col_values/2])/2;		}else{			$mIDpoint=$sort_col_values[$#col_values/2];		}		# 计算完成		print OUT "$mIDpoint\t"; #输出	}	print OUT "\n";}say "Done!";

没找到Perl源码嵌入格式,用python了@_@

花絮:
附上本人‘算法’涂鸦,见图2

总结

以上是内存溢出为你收集整理的Perl求中值全部内容,希望文章能够帮你解决Perl求中值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1283018.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存