今天写程序,遇到一个问题,有两个字符串用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 success\n"; return 0; } }</strong> print "invalide name or password\n"; 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>