perl数组排序(编写Perl程序实现双序列比对的,要用顺序比对算法)
本文目录
- 编写Perl程序实现双序列比对的,要用顺序比对算法
- perl 怎么对 中文做排序
- 把perl中hash的values按从大到小排列
- 如何用Perl对字符串或者数字数组进行排序
- 关于perl的<=>和sort
- perl数组怎么排重
- perl如何实现经典排序算法
- perl 中m行n列的列表按任一列排序怎么做啊
- perl 匹配两个数组
编写Perl程序实现双序列比对的,要用顺序比对算法
咯,确实没懂,不过用perl排序还是比较容易的。如下:
如三行三列数据分别为id name age:
1 wang 20
2 zeng 21
3 cheng 18
比如数据的文件名为t1.txt可以进行如下操作:
open (FH ,“t1.txt“) or die print “error $!“ ;
my @all= 《FH》;
my @alldata;
foreach(0..$#all)
{
my @row = split “ “ , $all[$_];
my %rowdata;
$rowdata{“id“} = $row;
$rowdata{“name“} = $row ;
$rowdata{“age“} = $row ;
$alldata[$_] = \%r;
}
@alldata = {$rowdata{$a}《=》$rowdata{$b}}@alldata; #然后对得到哈希数组进行排序:
#然后输出:
foreach(@alldata )
{
print $_-》{“id“},“\t“,$_-》{“name“},“\t“,$_-》{“age“},“\n“;
}
#===================
#或者参考下面.
my @line;
while(《》)
{
chomp;
push @line, [ split ];
}
foreach ( sort { $a-》 《=》 $b-》 or $a-》 《=》 $b-》 or $a-》 《=》 $b-》 } @line)
{
print @$_, “\n“;
}
perl 怎么对 中文做排序
楼上正解。
如三行三列数据分别为id
name
age:
1
wang
20
2
zeng
21
3
cheng
18
比如数据的文件名为t1.txt可以进行如下操作:
open
(fh
,“t1.txt“)
or
die
print
“error
$!“
;
my
@all=
;
my
@alldata;
foreach(0..$#all)
{
my
@row
=
split
“
“
,
$all[$_];
my
%rowdata;
$rowdata{“id“}
=
$row;
$rowdata{“name“}
=
$row
;
$rowdata{“age“}
=
$row
;
$alldata[$_]
=
\%r;
}
@alldata
=
{$rowdata{$a}《=》$rowdata{$b}}@alldata;
#然后对得到哈希数组进行排序:
#然后输出:
foreach(@alldata
)
{
print
$_-》{“id“},“\t“,$_-》{“name“},“\t“,$_-》{“age“},“\n“;
}
#===================
#或者参考下面.
my
@line;
while(《》)
{
chomp;
push
@line,
[
split
];
}
foreach
(
sort
{
$a-》
《=》
$b-》
or
$a-》
《=》
$b-》
or
$a-》
《=》
$b-》
}
@line)
{
print
@$_,
“\n“;
}
把perl中hash的values按从大到小排列
my @keys = sort { $h{$b} 《=》 $h{$a} } keys %h; #sort the hash table
上面的那一行就是排序的代码。程序如下:
#!/usr/perl/bin
use strict;
use Data::Dumper;
my %h=(
“Alex“=》24,
“Sam“=》25,
“Bob“=》30,
“Andy“=》11,
“Wills“=》35,
“Mary“=》16,
“Helen“=》24
);
print(Dumper(\%h)); # output original hash
my @keys = sort { $h{$b} 《=》 $h{$a} } keys %h; #sort the hash table
for (@keys){print “$_ -》 $h{$_}\n“}
-------------------------------------------
另外,我没记错的话, 可以return一个这样的list:
return ($key, $value)
我倒没用过perl的oo特性,不过我想用class也可以的。
如何用Perl对字符串或者数字数组进行排序
可以看下下面的例子
@m = (“123“, “456“, “1234“, “abc“);
@n = sort(@m);
print “@n\n“;
@m = (123, 456, 1234);
@n = sort {$a 《=》 $b} @m;
print “@n\n“;
关于perl的<=>和sort
这属于perl的高级排序, {$a 《=》 $b}相当于是子程序,相当于sub by_sort{if($a《$b}){-1}elsif($a》$b){1}else{0}},后面的数组是参数,每次传两个元素的参数,且反复调用该子程序,直到数组元素传完为止。
perl数组怎么排重
#!perl
@a=(5,5,3,1,1,2,2,3,3);
%number;
for $k (@a) {
next if exists $number{$k};
$number{$k}= 1;
}
for $key(sort keys %number)
{
print $key;
print “\n“;
}
perl如何实现经典排序算法
基于ASCII码排序
复制代码 代码如下:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper qw(Dumper);
my @words = qw(foo bar zorg moo);
say Dumper \@words;
my @sorted_words = sort @words;
say Dumper \@sorted_words;
上边的例子将会打印
复制代码 代码如下:
$VAR1 = [
’foo’,
’bar’,
’zorg’,
’moo’
];
$VAR1 = [
’bar’,
’foo’,
’moo’,
’zorg’
];
第一个输出显示了排序前的数组,第二个是排序后的。
这是最简单的情形,但是可能未必是你想要的。 比如,如果一些单词以大写字母开头怎么办?
复制代码 代码如下:
my @words = qw(foo bar Zorg moo);
@sorted_names里的结果将是:
复制代码 代码如下:
$VAR1 = [
’Zorg’,
’bar’,
’foo’,
’moo’
];
你会发现,以大写字母开头的单词排在了第一位。 这是因为sort默认根据ASCII码表排序,所有的大写字母都排在小写字母前边。
比较函数
Perl的sort的工作方式是这样的,它遍历原始数组的每两个元素;每次把左边的值放入变量$a,把右边的值放入变量$b。 然后调用比较函数。如果$a的内容应该在左边的话,“比较函数”会返回1;如果$b应该在左边的话,返回-1,两者一样的话,返回0。
通常你看不到比较函数,sort会根据ASCII码表对值进行比较,不过如果你想的话,你可以显式的写出来:
复制代码 代码如下:
sort { $a cmp $b } @words;
这段代码会跟没有使用块的sort @words达到同样的效果。
这里你可以看到,默认perl使用cmp作为比较函数。这是因为正是cmp可以做这里边我们需要的工作。 它比较两边的字符串的值,如果左边参数“小于”右边参数,就返回1;如果左边参数“大于”右边参数,就返回-1;如果相等,就返回0。
按字母顺序排列
如果你想忽略字符串的大小写来排序——即通常所谓的字母序,你可以像下一个例子这么做:
复制代码 代码如下:
my @sorted_words = sort { lc($a) cmp lc($b) } @words;
这里为了比较,我们调用lc函数返回参数的小写版本。然后cmp比较这些小写版本并决定原始字符串谁先谁后。
结果是
复制代码 代码如下:
$VAR1 = [
’bar’,
’foo’,
’moo’,
’Zorg’
];
Perl对数值排序
如果对数值数组使用sort进行默认的排序,结果可能不是我们期望的。
复制代码 代码如下:
my @numbers = (14, 3, 12, 2, 23);
my @sorted_numbers = sort @numbers;
say Dumper \@sorted_numbers;
$VAR1 = [
12,
14,
2,
23,
3
];
仔细一想的话,这并不奇怪。比较函数看到12和3时,它按字符串进行比较。这意味着比较两个字符串的第一个字符“1“和“3“。 在ASCII码表里,“1“在“3“前边,因此字符串“12“会排在字符串“3“前面。
Perl不会很神奇地猜到你想按数字对这些值排序。
尽管我们可以写一个比较函数来按数字比较两个值。但这里我们使用《=》(也被称作宇宙飞船操作符), 它会按数字来比较两个参数并返回1、-1或者0。
复制代码 代码如下:
my @sorted_numbers = sort { $a 《=》 $b } @numbers;
结果是:
复制代码 代码如下:
$VAR1 = [
2,
3,
12,
14,
23
];
perl 中m行n列的列表按任一列排序怎么做啊
楼上正解。
如三行三列数据分别为id
name
age:
1
wang
20
2
zeng
21
3
cheng
18
比如数据的文件名为t1.txt可以进行如下操作:
open
(FH
,“t1.txt“)
or
die
print
“error
$!“
;
my
@all=
《FH》;
my
@alldata;
foreach(0..$#all)
{
my
@row
=
split
“
“
,
$all[$_];
my
%rowdata;
$rowdata{“id“}
=
$row;
$rowdata{“name“}
=
$row
;
$rowdata{“age“}
=
$row
;
$alldata[$_]
=
\%r;
}
@alldata
=
{$rowdata{$a}《=》$rowdata{$b}}@alldata;
#然后对得到哈希数组进行排序:
#然后输出:
foreach(@alldata
)
{
print
$_-》{“id“},“
“,$_-》{“name“},“
“,$_-》{“age“},“
“;
}
#===================
#或者参考下面.
my
@line;
while(《》)
{
chomp;
push
@line,
[
split
];
}
foreach
(
sort
{
$a-》
《=》
$b-》
or
$a-》
《=》
$b-》
or
$a-》
《=》
$b-》
}
@line)
{
print
@$_,
“
“;
}
perl 匹配两个数组
这种应该没有什么好的办法,数据量不大的话,编写一个函数isInArray($val, @array),来判断一个数值是否在数组里,存在就返回1,不存在就返回0。
然后遍历另一个数组,分别判断是否在另一个数组里存在。
数据量大的话也可以这样做,不过事先对两个数组进行排序,isInArray里也修改一下,返回上一次成功找到时,比较到哪里了,下次比较时,从上次结束的地方开始找。
更多文章:
powerpoint2010中的段落对齐有几个种类(文档编辑段落对齐方式有哪五种)
2024年5月17日 21:39
peg人名翻译(我姓余,要取个英文名字,要把中文翻译和英文都写出来)
2024年5月19日 05:03
schedule用法及搭配(schedule作为动词的用法)
2024年7月23日 06:57
串口writefile函数(用WriteFile写串口后,提示错误“997“.问题出在哪)
2024年8月28日 11:45
有哪些比较准确的手机地图导航软件?国内自驾游使用哪种导航最靠谱
2024年7月1日 07:52
emphasis什么意思(point 和emphasis区别和用法)
2024年6月26日 06:25
tower block(20号楼B座怎么翻译用block还是tower)
2023年9月13日 22:20