Исходя из длины, я бы сказал, что вы получаете входную строку в виде:
test<cr><lf>
, где <cr>
и <lf>
- коды ASCII 0x13 и 0x10 соответственно.
Когда вы сжимаете его, он удаляет <lf>
, но оставляет <cr>
там.
Это почти наверняка проблема взаимодействия между Eclipse, Cygwin и Windows, не согласная с тем, какой должна быть последовательность символов конца строки. Я не смог воспроизвести вашу проблему только с Perl / Cygwin или Perl / Windows, но эта команда дает похожие результаты (в Cygwin):
echo 'test^M' | perl qq.pl | sed 's/^M/\n/g'
(qq.pl
- это ваш скрипт, а "^M"
- это фактический CTRL-M). Вот вывод в текстовом виде:
4 6
|test| |test
|
4 5
и восьмеричный дамп:
0000000 2034 0a36 747c 7365 7c74 7c20 6574 7473
4 6 \n | t e s t | | t e s t
064 040 066 012 174 164 145 163 164 174 040 174 164 145 163 164
0000020 7c0a 340a 3520 000a
\n | \n 4 5 \n \0
012 174 012 064 040 065 012 000
0000027
Итак, я бы сказал, что ваш ввод включает в себя <cr>
и <lf>
, а печать переводит <cr>
в <lf>
(или просто делает одно и то же для обоих из них).
Если вам нужен обходной путь для вашей среды, вы можете заменить строку chomp
на:
$input =~ s/\r?\n$//;
как в:
use warnings;
use strict;
my $test = "test";
my $input = <STDIN>;
print length $test ," ",length $input,"\n";
$input =~ s/\r?\n$//;
print "|$test| |$input|\n";
print length $test," ",length $input,"\n";
if ($test eq $input) {
print "TIME TO QUIT";
}
, который работает на Cygwin для тестовых данных, которые я использовал (конечно, проверьте это для вашей собственной ситуации), но вы можете обнаружить, что можете решить ее лучше, используя инструменты, которые все согласовывают последовательность конца строки (например, Perl для Windows, а не Cygwin, может помочь вам).