比较两段CODE,请您帮修改!谢谢~


你把你全部代码贴出来看看,那写法,如果没有输出,连空行都没有
那就说明exists为假,就说hash里面没这些ID
大概和文件格式或者读写操作有关吧,为了保险起见
print前面最好加句 $_=~s/\s//g;

改一下吧:

[Copy to clipboard] [ - ]
CODE:
while(<ID>){
    s/\s//g;
    if(exists($hash{$_})){
      print "$_\t$hash{$_}\n";
    }else{ warn "****$_****\n";
}

这样就清晰了

回perljoker:

QUOTE:
原帖由 perljoker 于 2008-1-17 12:49 发表

你把你全部代码贴出来看看,那写法,如果没有输出,连空行都没有
那就说明exists为假,就说hash里面没这些ID
大概和文件格式或者读写操作有关吧,为了保险起见
print前面最好加句 $_=~s/\s//g;

...

老大,谢谢指教,不过, $_=~s/\s//g;只能除去一个空白字符吧?我在ID.txt中每行ID后面加“>1”个空白字符后,使用$_=~s/\s//g;也能得到正确结果,WHY?
看大家JJWW了半天, 没那么复杂.

[Copy to clipboard] [ - ]
CODE:
use Tie::File::AsHash;

my($all_id_file,$bad_id_file)=@ARGV;
tie my %hash1, 'Tie::File::AsHash', $all_id_file, split => ','  or die $!;
tie my %hash2, 'Tie::File::AsHash', $bad_id_file, split => ' '  or die $!;


grep { print $_.':'.$hash1{$_} } keys %hash2;


untie %hash1;         
untie %hash2;        



QUOTE:
原帖由 duhast 于 2008-1-17 23:53 发表
看大家JJWW了半天, 没那么复杂.



use Tie::File::AsHash;

my($all_id_file,$bad_id_file)=@ARGV;
tie my %hash1, 'Tie::File::AsHash', $all_id_file, split => ','  or die $!;
tie my %hash2, 'Ti ...

不是标配:>

那就这样吧:
use strict;
use warnings;

open(ID_ALL, 'id_all.txt') or die "$!";
open(ID_EXP, 'id_exception.txt') or die "$!";

my %id_all = map { /(\d+)\s+(.*)\s*/ } <ID_ALL>;
my %id_exp = map { /(\d+)/ => $id_all{$1} || 'Unkown' } <ID_EXP>;
map { print "$_ => $id_exp{$_}\n" } (sort keys %id_exp);

close ID_EXP;
close ID_ALL;
楼上不错, 鼓掌.

+握手, 思路一致

回Lonki大大:
《大骆驼》散列一节,我认为hash基本的有下列两种写法:

QUOTE:
%map = ('red', 0xff0000,'green', 0x00ff00,'blue',0x0000ff);



QUOTE:
%map = (
      red => 0xff0000,
      green => 0x00ff00,
      blue => 0x0000ff,
           );

-----------------------------------
Lonki大大的CODE:

QUOTE:
my %id_all = map { /(\d+)\s+(.*)\s*/ } <ID_ALL>;
my %id_exp = map { /(\d+)/ => $id_all{$1} || 'Unkown' } <ID_EXP>;

老大这种写法确实还没有见过,尤其是您上面那个%id_all,我print %id_all测试了,并不符合上面两种hash格式。老大能详细讲解下么?拜托了!
大家学习直到深夜么?早上几点上班阿~
我先打CS游戏,然后学习,折腾到00:30实在不敢继续了-“明早8点上班呢”!


Lonki代码确实漂亮……,不过
my %id_all = map { /(\d+)\s+(.*)\s*/ } <ID_ALL>;
这句话我确实没看懂,map左边是hash,map里面是个正则
这样做会得到什么结果呢?还是竟然能得到$1和$2?

to LZ,我那个s/\s//g 因为后面有个g,所有会把所有空白替换掉……
路过问一下,如果我用
perl -e '........' file1 file2 ....filen
的方式处理n个文件,我有什么办法能判断我现在处理的是哪个文件?
那个不是都能用@ARGV识别么?


QUOTE:
原帖由 perljoker 于 2008-1-18 09:58 发表
那个不是都能用@ARGV识别么?

$ perl -ne 'print "$ARGV[0] $ARGV[1] $ARGV[2] $. $_"' file1 file2
file2   1 123
   2 456
$
file1的内容是123,file2的内容是456。好象不行呢。
而且如果要用ARGV来判断,我必须先知道文件名才行,还有其他的方法么?