加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl 两个字符串输出相同但是比较失败

发布时间:2020-12-15 23:46:11 所属栏目:大数据 来源:网络整理
导读:今天写程序,遇到一个问题,有两个字符串用print输出来是一模一样,但是用eq匹配就是不成功。 sub login{ my @array = ""; my $username = ""; my $password = ""; open($FILE_FD,":encoding(UTF-8)","/root/txt"); my %user = (); #保存所有用户名和密码键

今天写程序,遇到一个问题,有两个字符串用print输出来是一模一样,但是用eq匹配就是不成功。

sub login
{
        my @array = "";
        my $username = "";
        my $password = "";
        open($FILE_FD,"<:encoding(UTF-8)","/root/txt");
        my %user = ();  #保存所有用户名和密码键值对
        while($line = <$FILE_FD>)
        {       
                ($username,$password) = split(/ /,$line); 
                chomp($password);
                $user{$username} = $password;
        }       
        <strong>if( exists($user{$_[0]}))
        {       
            $temp = $user{$_[0]}^$random;
            if( ($temp cmp $passwd) ==0 )
            {       
                print "login successn";
                return 0;
            }       
        }</strong>       
        print "invalide name or passwordn";
        return 1;
}
经过调试,发现加粗这段代码有错误,最后用print同时输出? $temp和 ?$passwd发现两个内容是一模一样的,但是用cmp或者eq就比较失败,于是在网上看有可能是打开文件时会有用不同的字符编码的方式打开文件导致数据不一致的问题,从而导致比较失败。于是给打开文件函数增加了 open($FILE_FD,"/root/txt");但是经过分析,程序输入并没有中文字符或者特殊符号的输入,最后这种改进方法被排除。

最后几经周折才发现虽然打印出来的字符串看上去完全没有别的字符或者转义字符,但是确实是存在的。加上$temp =~ s/W//g;这一句之后代码运行通过。

顺便解释一下$temp =~ s/W//g;?s表示替换匹配的部分,W表示除过[0~9][A~Z][a~z]的字符,后面/表示替换为空,g表示全局出现的字符串。

第一次写东西。希望大家多改正改正。谢谢了!共同进步!


<span style="font-family:SimSun;">
</span>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读