使用以下代码:
use strict;
use warnings;
use utf8;
use IO::Pty;
use Data::Dump qw(pp);
my $pty = IO::Pty->new;
open *STDOUT, '>&', $pty->slave;
if ( my $pid = open *STDOUT, '|-' ) {
# parent
my $str = "foo\n";
print {*STDERR} "parent [1]: ", pp($str), "\n";
print {*STDOUT} $str;
my $line = <$pty>;
print {*STDERR} "parent [2]: ", pp($line), "\n";
} else {
# child
while (<>) {
print {*STDERR} "child [1]: ", pp($_), "\n";
s/foo/bar/;
print {*STDERR} "child [2]: ", pp($_), "\n";
print $_;
} ## end while (<>)
exit;
} ## end else [ if ( my $pid = open *STDOUT...)]
我得到的输出是:
parent [1]: "foo\n"
child [1]: "foo\n"
child [2]: "bar\n"
parent [2]: "bar\r\n"
但是,在最后一行,我希望收到“bar “。另外,我在 Linux 下运行 Perl,所以这个 LF 到 CRLF 的废话不应该是一个问题吗?
\r
和 \n
是“控制字符”。 “控制角色”在控制什么?打字机。好吧,它曾经是。
TTY 早于计算机,可以追溯到电报。 TTY代表电传打字机;从字面上看,它是一台打字机。因为它是一台打字机,所以需要告诉它滑动(返回)打印头(托架)回到页面的第一列,然后将纸张前进到下一行。
\r\n
.
现在这已经融入了 tty 协议。尽管技术在不断发展,但它仍然表现得像在和打字机说话。
正如用户 Schwern 所说,问题是由 TTY 本身引起的。 我通过在 TTY 上使用原始模式解决了它。
$pty->slave->set_raw();
$pty->set_raw();