English 中文(简体)
为什么没有用Eclipse和Cygwin Perl拆除视窗XP的新线?
原标题:Why does chomp fail to remove newlines on Windows XP with Eclipse and Cygwin Perl?
  • 时间:2009-10-05 06:30:53
  •  标签:

I m 运行Windows XP, Eclipse 3.2 with EPIC and Cygwin for my Perl Interpretation,我得到意外结果。

FYI... 当我在乌本巴分配时( RV,同页)。 我获得了预期成果。 为什么?

############ CODE: #############

use warnings;
use strict;

my $test = "test";
my $input = <STDIN>;

print length $test, " ", length $input, "
";

chomp $input;

print "|$test| |$input| 
";    #The bars indicate white space, new line, etc...

print length $test, " ", length $input, "
";

if ($test eq $input) {
    print "TIME TO QUIT";
}

www.un.org/Depts/DGACM/index_spanish.htm Windows XP:

test           <-- My input
4 6            <-- Lengths printed before chomp
|test| |test   <-- Print the variables after chomp
|              <-- There is still a new line there
4 5            <-- Lengths after the initial chomp
最佳回答

根据时间长短,我说,你重新获得投入,表明:

test<cr><lf>

<cr>和<lf>分别为0x13和0x10。

当你遵守时,删除了<代码><lf>,但留下<cr>

它几乎肯定是一个Eclipse、Cygwin和Windows之间的相互作用问题,但不同意哪一个线末特性顺序。 我可以把你的问题仅仅重复到Perl/Cygwin 。 Perl/Windows, 但这一指挥结果类似(Cygwin):

echo  test^M  | perl qq.pl | sed  s/^M/
/g 

(qq.pl 是您的文字和>^M>是实际的CTRL-M。 本文案文中的产出:

4 6
|test| |test
|
4 5

垃圾堆放场:

0000000 2034 0a36 747c 7365 7c74 7c20 6574 7473
          4       6  
   |   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
         
   |  
   4       5  
  
        012 174 012 064 040 065 012 000
0000027

因此,我这样说,你的投入载于<代码><cr>and<>>>>><lf>,印刷版正在翻译<代码><cr>至<lf>(或仅对两者做相同的事情)。

如果您需要工作环境,你可以取代<代码>chomp。 内容提要

$input =~ s/
?
$//;

a 包括:

use warnings;
use strict;
my $test = "test";
my $input = <STDIN>;
print length $test ," ",length $input,"
";
$input =~ s/
?
$//;
print "|$test| |$input|
";
print length $test," ",length $input,"
";
if ($test eq $input) {
    print "TIME TO QUIT";
}

用于测试数据I的Cygwin(当然是为了你自己的情况检查),但你可能认为,你可以通过使用所有商定线端序列的工具(例如,Windows的Perl,而不是“Cygwin”——你可以做的骗子)来更好地解决。

问题回答

鉴于Windows XP在问题中的数字,差异必须归因于CRLF(卡里拉交回、线索)的处理。 <代码>chomp去除,看上去的是LF,而不是CR;印刷版将CR转化为CR LF。

The Perl doc for chomp says that if you set the EOL correctly for Windows ($/ = " ";), then chomp should do its stuff correctly:

$/ = "
";
$test = "test
";
print "<<$test>>
";
chomp $test;
print "<<$test>>
";

排放物的废墟:

0x0000: 3C 3C 74 65 73 74 0D 0A 3E 3E 0A 3C 3C 74 65 73   <<test..>>.<<tes
0x0010: 74 3E 3E 0A                                       t>>.
0x0014:

我不敢肯定为什么不自动设定<代码>$/——这可能是混杂的(似乎太成功地投了“Unix”)。

Here is how to remove a trailing or (whichever is at the end):

$input =~ s@
?
(?!
)@@;

另一种选择是:

binmode(STDIN,  :crlf )

before reading anything from STDIN. This would convert trailing to just a , which you can remove using chomp. This will also work even if your input contains only . See the documentation about PerlIO for more.





相关问题