2013-03-12 63 views
1

我试图用readline替换STDIN。如果我使用STDIN(就像在注释中看到代码一样),那么在相同行中的printf输出之后,光标就准备好输入了。但是使用readline printf输出不知何故,只有readline提示可见。我可以插入“打印”\ n“;” (注释掉)到printf的下一行,它将提示移动到下一行,并且printf输出可见。但是,我想要在提示符后直接输入一个格式化提示和光标(相同行)。 printf赋值比以下示例稍微复杂一些。 printf可行吗?我有什么选择? Thanx提前。如何在Perl中结合printf和readline

#!/usr/bin/perl -w 

use Term::ReadLine; 
use Term::ReadKey; 
my $term = Term::ReadLine->new('name'); 

printf "%-12s","Input: "; 
# my $new_value = <STDIN>; 
# print "\n"; 
my $new_value = $term->readline('--> '); 
+0

作为choroba提到的,你可能会从缓冲是痛苦:见http://perl.plover.com/FAQs/Buffering.html的DET ails – jblue 2013-03-13 00:53:31

回答

1

printf的输出延迟的原因是缓冲。为了避免它,你可以使用STDERR未进行缓冲,也许更适合这个类型的输出:

printf STDERR '%-12s', 'Input: '; 

或者,你可以让STDOUT冲洗更多的时候:

local $| == 1; 

另一种选择是使用sprintf代替printf,把整个表达式的提示:

my $new_value = $term->readline(sprintf '%-12s-->', 'Input: '); 
+2

我发现以符合其命名的方式使用输出流很有用。所以,我不使用'STDERR'输出错误或日志消息以外的任何内容。我觉得建议使用'STDERR'作为其缓冲特性,而不是与其名称一致。此外,'$ |'是一个标志。因此,分配一个值而不是递增或递减是正确的。只有你最后的建议才有实际价值:如果你想要一个特定的提示,你应该提供完整的提示文本。 – 2013-03-13 18:47:54

+0

你应该使用'$ | = 1'或'local $ | = 1;'not'$ | --''。如果有人已经将其设置为1,则最终会关闭自动刷新。它也不会禁用缓冲,它只会导致Perl更频繁地刷新缓冲区的内容。这就是为什么它通常被称为[autoflush变量](http://perldoc.perl.org/perlvar.html#%24%7c)。 – 2013-03-14 01:01:09

+0

@SinanÜnür:谢谢,更新。 – choroba 2013-03-14 06:49:06