帮忙看看这个程序

帮忙看看这个程序

我有一个文件$file,基本内容是这样的:

aa bb
cc dd
ee ff
bb gg
hh ii
jj aa
kk dd
cc ff
...

每一行都有2个元素,然后我要把有相同元素的行取出来放在一个新的文件里,如
新文件一:
aa bb
bb gg
jj aa

新文件二:
cc dd
kk dd
cc ff
ee ff

也就是说只要每一行有一个元素相同,就把它们放在一个新的文件里,每一行被归入一个新的文件后,就不需要再重复归入别的文件,也就是说每一行处理一次就行了。

现在我写下来的问题是,知道怎么把相同的行放在一个新的文件里,但是每一行都会被处理很多次,有很多的重复文件生成,请高手指教一下
有没有高手帮帮忙,或者给个思路也行

我现在用现有的知识无法解决,只能手动

以第一行为例,先在整个文本里面搜aa,得到
aa bb
jj aa

然后在整个文本里面搜bb,得到
aa bb
jj aa
bb gg

然后在整个文本里面搜jj,如果有jj,就打印到下面

然后在整个文本里面搜gg,如果有gg,就打印到下面

...

一直这样,直到这样的行全部被搜到为止

我想用hash变量对应于每行的两个元素,但是在键和值中都有重复,不知道该怎么处理了,请大家帮忙了,急用,谢谢拉

或者有什么其它的工具也行,谢谢拉

大体看懂了你的意思
手头没有类unix的环境
所以只能讲讲我的思路,一家之言
hash的key还是用行号来做好了,value则用一个匿名list
行号可以用$.变量(印象中是这个变量)获得,或者你可以从1开始,读一行加一个
读取的过程可以用下面的代码(没有测试过)

[Copy to clipboard] [ - ]
CODE:
my %hash;
while(<$file>){
$hash{$.}= split;
}

谢谢,我还是入门级的新手,请问你的意思是:用行号作key,value是包括两个字串的数组?
这个hash应该怎么写

my %hash;
while(<$file>){
$hash{$.}= split;
}
如何把每一行的数组存入hash变量的value中


QUOTE:
原帖由 duziteng 于 2008-2-11 10:49 发表
谢谢,我还是入门级的新手,请问你的意思是:用行号作key,value是包括两个字串的数组?
这个hash应该怎么写

you are right
split默认对$_进行操作,返回一个list给hash作为value
我以前只在书上看到过,没有实践过
过几天回校我我再实验下
ms我讲错了
又挂在context上面了
$hash{$_} = split;
左边是一个scalar的context

可以用下面的代码

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
#===============================================================================
#
#         FILE:  readin.pl
#
#        USAGE:  ./readin.pl
#
#  DESCRIPTION:  hash
#
#      OPTIONS:  ---
# REQUIREMENTS:  ---
#         BUGS:  ---
#        NOTES:  ---
#       AUTHOR:  Leenux (Mr), <[email]firefoxelectric@gmail.com[/email]>
#      COMPANY:  Debian GNU/Linux
#      VERSION:  1.0
#      CREATED:  02/14/2008 09:52:10 PM CST
#     REVISION:  ---
#===============================================================================

use strict;
use warnings;
my %hash;
open my $file, "<", "data" or die "fail to open $!";
while (<$file>) {
    my @tmp = split;
    $hash{$.} = \@tmp;
}
foreach ( sort keys %hash ) {
    print "$_ value one: $hash{$_}->[0]\n";
    print "$_ value two: $hash{$_}->[1]\n";
}

运行结果

QUOTE:
kernel@fairland:~/chinaunix$ cat data
bb cc
ee ff

kernel@fairland:~/chinaunix$ ./readin.pl
1 value one: bb
1 value two: cc
2 value one: ee
2 value two: ff

试试这个
while(<>){
  $_ = /(\S+)/;
  print "$1\n";
}
剩下的自己想吧,呵呵