免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4305 | 回复: 11
打印 上一主题 下一主题

郁闷的字符串比较问题,显示明明一样,可就不能执行相等时的语句 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-05 21:43 |只看该作者 |倒序浏览
foreach my $n(0..$i){
print "loop now : $poster : $userlist[$n] \n";
                if ("$userlist[$n]" eq "$poster"{
                        print "title : \t ".$row->{"title"}."\n";
                        print "poster : \t ".$row->{"poster"}."\n";
                }
}


郁闷,从print显示上看:$poster和$userlist[$n] 显示出来的结果完全一样。
可就是不能执行:
                        print "title : \t ".$row->{"title"}."\n";
                        print "poster : \t ".$row->{"poster"}."\n";
这二句。

编码方面:$poster是从网页上抓来的东西,该网页是用utf8编码的,$userlist[$n] 是我在linux下保存在文件里的内容,默认就是utf8编码的,我就奇怪了,为啥就不能相等呢?

救我呀!

论坛徽章:
0
2 [报告]
发表于 2010-07-05 21:44 |只看该作者
我先来顶了!

论坛徽章:
0
3 [报告]
发表于 2010-07-05 22:29 |只看该作者
你length一下你要比较的两个变量,看看结果是不是一样的?
我觉得吧,这个就是编码不一致造成的,保证以下两个
1. 网页的内容使用如下方式解码

  1. Encode::decode("UTF-8",$content)
复制代码
2.如果是读入文件,使用如下方法读取

  1. open my $file,"<:encoding(UTF-8)",$filename
复制代码
或者你自己通过(_utf8_on,_utf8_off)去设置编码(不推荐)

论坛徽章:
0
4 [报告]
发表于 2010-07-05 22:39 |只看该作者
我猜可能是 $poster 或者 $userlist[$n] 里面有\t\s\n等
$poster =~ s/\W//g;  试试看

论坛徽章:
0
5 [报告]
发表于 2010-07-05 22:42 |只看该作者
谢谢二楼的兄弟,用length测试过了,长度相同,你说怪不怪。

论坛徽章:
0
6 [报告]
发表于 2010-07-05 22:43 |只看该作者
本帖最后由 sx98083714 于 2010-07-05 22:48 编辑

#!/usr/bin/perl
use strict;
use URI;
use Encode;
use Web::Scraper;
open(FH,"<:encoding(UTF-","userlist";
my $i=0;
my @userlist;
while(<FH>{
        #decode('utf8',$_);
        my $user=$_;
        $user=~s/\n\r//;
        Encode::_utf8_on($user);
        chomp($user);
        $userlist[$i]=$user;
        $i++;
}
my $url="http://bbs.sh.libaclub.com/f_37_199_1.htm";
my $scraper=scraper{
        process '//tr[@class="list_item"]',"rows[]"=>scraper{
                process ".i2 > a",link=>'@href',title=>'TEXT';
                process ".i4 > a",poster=>'TEXT';
                };
        };
my $res=$scraper->scrape(URI->new($url));
for my $row(@{$res->{rows}}){
my $poster=$row->{"poster"};
        Encode::_utf8_on($poster);
        chomp($poster);
        foreach my $n(0..$i){
                if ("$userlist[$n]" eq "$poster"{
                        print "title : \t ".$row->{"title"}."\n";
                        print "poster : \t ".$row->{"poster"}."\n";
                }
        }
}

cat   userlist    我想把这个文件中包含的用户发的贴子都输出出来
sx98083714   
ideal.shen

http://bbs.sh.libaclub.com/f_37_199_1.htm
这是篱芭的一个版块,我上面使用sx98083714这个用户名发了二个贴子,我想把对应的贴子标题等输出出来。

我全部贴出来,劳驾高手来指点下迷津了,谢谢!

论坛徽章:
0
7 [报告]
发表于 2010-07-05 22:49 |只看该作者
多说几句吧

  1. use strict;
  2. use warnings;
  3. use Encode qw(is_utf8);
  4. print "utf8 flag is on\n" if is_utf8($ARGV[0]);
  5. print length($ARGV[0]),"\n";
复制代码
kernel@fairland:~/tmp$ ./read.pl 测试
6

我的终端是en_US-UTF-8编码的,如果你认为既然都是UTF-8编码的就可以不用解码就错了

perl并不知道外部输入的内容是什么编码的,所以你需要解码

  1. use strict;
  2. use warnings;
  3. use Encode qw(is_utf8);
  4. $ARGV[0]=Encode::decode("UTF-8",$ARGV[0]);
  5. print "utf8 flag is on\n" if is_utf8($ARGV[0]);
  6. print length($ARGV[0]),"\n";
复制代码
kernel@fairland:~/tmp$ ./read.pl 测试
utf8 flag is on
2


同样的,你从文件中读取数据也需要解码,你可以读一行然后使用Encode::decode解码,或者也可以让perl帮你做,方法就是在打开文件的时候就指名文件编码

  1. open my $file,"<:encoding(UTF-8)",$filename
复制代码
同样的对于STDIN,STDOUT,STDERR也可以类似的设置

  1. binmode STDIN,":encoding(UTF-8)";
复制代码
最后说一句,从命令行传进来的参数(@ARGV)不属于STDIN

论坛徽章:
0
8 [报告]
发表于 2010-07-05 22:54 |只看该作者
受教了,非常感谢!

我再整理下看看。

论坛徽章:
0
9 [报告]
发表于 2010-07-05 23:53 |只看该作者
本帖最后由 churchmice 于 2010-07-05 23:56 编辑

如果是纯英文的话跟编码没有关系的,你再检查检查吧,把
use warnings 加上,看看是不是其他地方出错了,特别注意空格等不可见字符,看看是不是因为这个导致字符串不一样
而且你的东西length又一样,我这边重现不了,Scraper有些依赖我这边不能满足,懒得整了

论坛徽章:
0
10 [报告]
发表于 2010-07-06 00:10 |只看该作者
use warnings 开了,警告也没有,真晕了。可能是空格换行之类导致的吧,得休息了,明天继续找。谢谢楼上热心的哥们,也早点睡吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP