亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 9918 | 回復(fù): 24
打印 上一主題 下一主題

求助:perl hash中多元鍵和值的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-12-09 13:57 |只看該作者 |倒序瀏覽
一個文件,有n行9列,第一列有13個不同的元素,第七列是正反向。第四列和第五列是起始和終止的位置,其余列不用管。
簡化成一個這樣的文件:

name     direction     start      end
a1           +               1           3
a1           +               4           5
a1           -                2           4
a1           -                5           6
a2           +               3           7
a2           -                1           5

想得到的結(jié)果是:
a1    +    1     3     4      5
a1    -     2     4     5      6
a2    +    3     7
a2    -     1      5

我的思路是,將前兩列作為hash的鍵,后兩列作為hash的值來進(jìn)行處理。但while (<IN>),它是一行一行處理,到最后打印時,只打印出循環(huán)的最后一行結(jié)果。
拜托高手指點一下,謝謝了。。。

論壇徽章:
0
2 [報告]
發(fā)表于 2012-12-09 14:06 |只看該作者
目測是你把哈希定義在循環(huán)里面了~

論壇徽章:
0
3 [報告]
發(fā)表于 2012-12-09 14:17 |只看該作者
回復(fù) 2# kiwivip


    是,那是一個在服務(wù)器中的文件,我先得讀進(jìn)它。。。嗯,剛學(xué)perl不久,能指點一下么?謝謝了~

論壇徽章:
0
4 [報告]
發(fā)表于 2012-12-09 14:43 |只看該作者
回復(fù) 3# 小豬Gina
  1. %hash=();
  2. while(<IN>) {
  3.     ($name,$direction,$start,$end)=(split)[0,6,3,4];
  4.     if (defined($hash{$name}{$direction})) {
  5.         my @tmp=(@{$hash{$name}{$direction}},$start,$end);
  6.         $hash{$name}{$direction}=\@tmp;
  7.     } else {
  8.         $hash{$name}{$direction}=[$start,$end];
  9.     }
  10. }
  11. foreach $n (sort keys %hash) {
  12.     foreach $d (sort keys %{$hash{$n}} ) {
  13.       print "$n $d @{$hash{$name}{$direction}}\n";
  14. }
復(fù)制代碼

論壇徽章:
0
5 [報告]
發(fā)表于 2012-12-09 17:17 |只看該作者
回復(fù) 4# cecial


    謝謝您,可以問一下 (split)[0,6,3,4];的含義嗎?謝謝~

論壇徽章:
0
6 [報告]
發(fā)表于 2012-12-09 18:20 |只看該作者
先謝謝三樓的幫助,不過那個(split)[0,6,3,4];確實不明白,在他給的代碼的基礎(chǔ)上,稍微更改整理了一下,下面的代碼運行過了,是可以正確運行的。
my %hash=();
while(<IN>) {
        my($name,$direction,$start,$end)=split(/\s+/,$_);
        if (defined($hash{$name}{$direction})) {
                my @tmp=(@{$hash{$name}{$direction}},$start,$end);
        $hash{$name}{$direction}=\@tmp;
        }else{
                $hash{$name}{$direction}=[$start,$end];
        }
}

foreach my $n (sort keys %hash) {
        foreach my $d (sort keys %{$hash{$n}} ) {
                print "$n $d @{$hash{$n}{$d}}\n";
        }
}

論壇徽章:
0
7 [報告]
發(fā)表于 2012-12-09 19:54 |只看該作者
現(xiàn)在又碰到了一個問題,那個文件的
name     direction     start      end
a1           +               4           5
a1           +               1           3

a1           -                2           4
a1           -                5           6
a2           +               3           7
a2           -                1           5

還是想得到
a1    +    1     3     4      5
a1    -     2     4     5      6
a2    +    3     7
a2    -     1      5

就是將 stat 列進(jìn)行從小到大進(jìn)行排序,可以指點一下么?謝謝~

論壇徽章:
0
8 [報告]
發(fā)表于 2012-12-09 22:37 |只看該作者
問題已解決了。代碼分享給那些需要的人吧~
open (IN,"< test.txt") || die "Can't open \n";
my %hash=();
my @arrays = <IN>;
my @lie = sort {(split /\s+/,$a)[2] <=> (split /\s+/,$b)[2] }@arrays;

for (my $i=0;$i<=$#lie;$i++) {
        my @line=split(/\s+/,$lie[$i]);
        my($name,$direction,$start,$end)=("$line[0]","$line[1]","$line[2]","$line[3]");
        if (defined($hash{$name}{$direction})) {
        my @tmp=(@{$hash{$name}{$direction}},$start,$end);
        $hash{$name}{$direction}=\@tmp;
        }else{
                $hash{$name}{$direction}=[$start,$end];
        }   
}

foreach my $n (sort keys %hash) {
        foreach my $d (sort keys %{$hash{$n}} ) {
                print "$n $d @{$hash{$n}{$d}}\n";
        }
}
close (IN);

經(jīng)過試驗,沒有問題的。

論壇徽章:
0
9 [報告]
發(fā)表于 2012-12-09 23:12 |只看該作者
回復(fù) 8# 小豬Gina


    排序完全可以放在輸出啊,省去了第一次的split+排序。
我優(yōu)化了一下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. my $title = <DATA>;
  6. my %hash = ();
  7. while (<DATA>) {
  8.     my ($name,$direction,$start,$end) = split;
  9.     push @{ $hash{"$name\t$direction"}}, $start, $end;
  10. }
  11. foreach my $k ( sort keys %hash ) {
  12.     print join("\t", $k, sort { $a <=> $b } @{$hash{$k}}), "\n",
  13. }
  14. __DATA__
  15. name     direction     start      end
  16. a1           +               4           5
  17. a1           +               1           3
  18. a1           -                2           4
  19. a1           -                5           6
  20. a2           +               3           7
  21. a2           -                1           5
復(fù)制代碼

論壇徽章:
3
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
10 [報告]
發(fā)表于 2012-12-10 11:05 |只看該作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;
  5. my %hash;
  6. my $title;
  7. while(<DATA>){
  8.     if(/(\w+\s+(?:\+|-))\s+(\d+)\s+(\d+)/){
  9.         push @{$hash{$1}},$2,$3;
  10.     }else{
  11.         $title = $_;
  12.     }
  13. }
  14. map{print "$_\t";print join("\t",sort{$a cmp $b}@{$hash{$_}});print "\n"}sort keys %hash;

  15. __DATA__
  16. name     direction     start      end
  17. a1           +               4           5
  18. a1           +               1           3
  19. a1           -                2           4
  20. a1           -                5           6
  21. a2           +               3           7
  22. a2           -                1           5
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP