我的程序正在逐行读取文件。但是如果找到一个不可打印的字符(例如十进制值小于32的字符),那么我只想向控制台输出一条错误消息。
这就是我所拥有的
while($line=<FILE>){
print $line;
$line =~ s/^\s+//; #remove leading spaces
$line =~ s/\s+$//; #remove trailing spaces
if(/[\x00-\x1F]/){
print "Found a non printable!";
}
我不确定它是否有效,因为我猜我不确定我的文件中的不可打印内容是什么?
这是我当前的输入文件:
Pa$$word412
999
回车不会不可打印吗?那不应该打印我的警告信息吗?
谢谢!
答案 0 :(得分:2)
您正在阅读$line
行,但未在匹配时引用该行。您需要明确地匹配$line
:
if ($line =~ /[\x00-\x1F]/) {
或者,更好的是,只需将您的行放入$_
:
while (<FILE>) {
print;
s/^\s+//; # remove leading spaces
s/\s+$//; # remove trailing spaces
if (/[\x00-\x1F]/) {
print "WARNING -- Non-printables were found; they have been detected.";
}
}
跟踪换行符不会触发您的警告,因为它们与\s
匹配,并且会因删除尾随空格而被删除。如果您需要测试用例,请在文件中添加制表符;这应该匹配[\x00-\x1F]
。
答案 1 :(得分:1)
根据您的定义,回车符不可打印;但是当你说
时,你正在从输入中删除回车$line =~ s/\s+$//; #remove trailing spaces