Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Term::多终端历史的Readline_Perl_Readline - Fatal编程技术网

Perl Term::多终端历史的Readline

Perl Term::多终端历史的Readline,perl,readline,Perl,Readline,我想使用Term::ReadLine来表示两个具有独立历史记录的流。这可能吗?当我将下面的代码与两个单独的“终端”一起使用时,历史会混合在一起,当我查看$term\u 1->Attribs和$term\u 2->Attribs返回的Attribs散列时,调试器说它们使用相同的内存位置。在这两种情况下调用的add_history函数是相同的Gnu XS函数,据我所知,它没有选择缓冲区。 #!/usr/bin/perl -w use strict; use warnings; use utf8; b

我想使用Term::ReadLine来表示两个具有独立历史记录的流。这可能吗?当我将下面的代码与两个单独的“终端”一起使用时,历史会混合在一起,当我查看$term\u 1->Attribs和$term\u 2->Attribs返回的Attribs散列时,调试器说它们使用相同的内存位置。在这两种情况下调用的add_history函数是相同的Gnu XS函数,据我所知,它没有选择缓冲区。

#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
binmode(STDIN, 'utf8');
binmode(STDOUT, 'utf8');
# turn off underline on prompt.
$ENV{"PERL_RL"} = "o=0";

use Term::ReadLine;

my $term_1 = Term::ReadLine->new('term 1');
$term_1->enableUTF8();
my $OUT_1 = $term_1->OUT || \*STDOUT;

my $term_2 = Term::ReadLine->new('term 2');
$term_2->enableUTF8();
my $OUT_2 = $term_2->OUT || \*STDOUT;

# my $attrs =  $term_1->Attribs();
# for my $key (sort keys %{$attrs}) {
#     printf("%15s : %s\n", $key, $attrs->{$key});
# }
my $i_1 = 1;
my $i_2 = 1;
while (1) {
    $_ = $term_1->readline(sprintf("T 1:%2d > ", $i_1++));
    $term_1->addhistory($_) if /\S/;
    print $OUT_1 "\"$_\"\n";
    exit() if $_ eq 'q';

    $_ = $term_2->readline(sprintf("T 2:%2d > ", $i_2++));
    $term_2->addhistory($_) if /\S/;
    print $OUT_2 "\"$_\"\n";
    exit() if $_ eq 'q';
}
我正在使用Perl5版本26的Ubuntu 16.04

感谢后端,您可以使用
clear_history()
SetHistory()
模拟两个独立的历史记录。例如:

my @hist1;
my @hist2;
while (1) {
    $term_1->clear_history();
    $term_1->SetHistory(@hist1);
    $_ = $term_1->readline(sprintf("T 1:%2d > ", $i_1++));
    push @hist1, $_ if /\S/;
    print $OUT_1 "\"$_\"\n";
    exit() if $_ eq 'q';
    $term_2->clear_history();
    $term_2->SetHistory(@hist2);
    $_ = $term_2->readline(sprintf("T 2:%2d > ", $i_2++));
    push @hist2, $_ if /\S/;
    print $OUT_2 "\"$_\"\n";
    exit() if $_ eq 'q';
}

addhistory()
libreadline.so
中调用
add_history()
,该文件将历史记录作为静态变量。这意味着此函数不支持给定进程的多个历史记录。但是两个不同的进程将有不同的历史记录(因为静态变量是分开的)。注意:上面是针对后端包
Term::ReadLine::Gnu
,我没有检查其他后端在
Term::ReadLine::Gnu
中有函数
clear_history()
SetHistory()
。也许这些可以用来模拟两个不同的历史?谢谢。我很难为情地承认我错过了gnu readline文档。此外,你似乎不需要做清楚的历史。