【发布时间】:2011-08-27 15:45:52
【问题描述】:
Perl 继续让我感到惊讶。我有一个代码,它从命令行获取输入并检查它是否在文件中。我有一个这样的文件:
ls
日期
密码
触摸
rm
首先我将这个文件读为
open(MYDATA,"filename") or die "Can not open file\n";
@commandlist = <MYDATA>;
chomp @commandlist;
close MYDATA;
参数在 $commandname 变量中。为了检查它是否正确,我打印到屏幕上。
print $commandname."\n";
效果很好。然后我写代码。
$count = @commandlist;
for($i=0;$i < $count;$i++)
{
print $commandname;
print $commandlist[$i];
print "\n";
if($commandname eq $commandlist[$i])
{
print "equal\n";
}
}
并且它不打印'equal'。但它应该这样做,因为 $commandname 变量具有文件中的值 'ls'。我还打印 $commandname 和 $commandlist[$i] 的值以查看它们是否“明显”相等,然后我得到输出:
ls
lsls
lsdate
lspwd
lstouch
lsrm
在这里我看到他们得到了相同的值,但为什么 eq 运算符从不计算为零。 此外,为了完成这项任务,我尝试了各种方法,所有这些方法都变得无用,例如从数组中生成哈希并使用存在。 我为这个看似简单的问题苦苦挣扎了一天,但我就是不明白。 提前致谢
编辑: 当我改变上面的循环如下
$count = @commandlist;
for($i=0;$i < $count;$i++)
{
print $commandlist[$i];
print $commandname;
print "\n";
if($commandname eq $commandlist[$i])
{
print "equal\n";
}
}
我得到了类似的输出。
ls
ls
lste
lsd
lsuch
ls
似乎由于某种原因它覆盖了某些字符。
编辑:
我的整个脚本是这样的:
#reading file code, i posted above
while(<>)
chomp($_);
$commandname = $_;
if($commandname eq "start"){
##something here
} elsif ($commandname eq "machines"){
##something here
} else {
$count = @commandlist;
for($i=0;$i < $count;$i++)
{
print $commandlist[$i];
print $commandname;
print "\n";
if($commandname eq $commandlist[$i])
{
print "equal\n";
}
}
}
【问题讨论】:
-
能不能打印一些标签里包裹的变量(比如 print "--$commandname--\n"; 或者 print "--" . $commandlist[$i] . "--\ n"; 看看变量中是否没有空格/crlf?
-
我没有尝试过,但我知道没有任何空格,因为我得到的输出我也在上面发布。
-
“当我改变循环如下”该循环看起来与上面的相同。使用
print "cmd: ($commandname)\n"可以准确查看哪个打印属于哪个数据,以及其中包含哪些字符。 -
字符似乎被覆盖的原因是因为您的文本文件中的行是用回车符+换行符分隔的,而不仅仅是换行符。显然,您正在使用可能配置错误的 Perl 版本的 Windows 机器上运行脚本。要修复,您需要 $commandlist[$i]=~s/\r?\n$//;在比较之前。
标签: perl string comparison