gpt4 book ai didi

perl - 等待远程数据时读取STDIN;下载远程数据时终止

转载 作者:行者123 更新时间:2023-12-02 09:24:06 24 4
gpt4 key购买 nike

我有一个简单的 perl 脚本:

#!/usr/bin/env perl

use strict;
use Data::Dumper;
use utf8;
binmode( STDOUT, ":utf8" );
$|++;

my $localBookmarks = {
a => "local bookmark A",
b => "local bookmark B",
c => "local bookmark C",
};
print Dumper $localBookmarks;

my $remoteBookmarks = getRemoteBookmarks();
print Dumper $remoteBookmarks;

print "choose a bookmark: ";
my $answer = <STDIN>;
print "You want: $answer";
# process $answer...

sub getRemoteBookmarks
{
# Net::SSH::Perl connection; exec command; parse it; return it
# lets just simulate this
sleep( 5 );
return { d => "remote bookmark D", e => "remote bookmark E" };
}

输出为:

$ perl test.pl
$VAR1 = {
'b' => 'local bookmark B',
'a' => 'local bookmark A',
'c' => 'local bookmark C'
};
$VAR1 = {
'd' => 'remote bookmark D',
'e' => 'remote bookmark E'
};
choose a bookmark:

当然是在print Dumper $localBookmarks之后沉默了 5 秒钟。

是否可以读取 <STDIN>打印“本地书签”后,等待“远程书签”?如果我知道这次我只需要本地书签(而且我不必等待几秒钟即可下载)。否则,当下载“远程书签”时,当前<STDIN>应该终止,下载的书签应该被打印,并且 - 再次 - 在底部应该有 <STDIN> 。这可以用 Perl 实现吗?

最佳答案

有多种方法可以做到这一点。更明显的方法之一是生成一个线程来执行远程工作,并且在从 STDIN 读取数据后,假设您无法在那里找到答案,请加入该线程(以确保它已完成)并在那里进行检查。该线程需要执行 getRemoteBookmarks 中已有的所有操作,并删除“选择书签”行(通常打印 "\r", ' ' x 60, "\r ” 就足够了),打印出新组的转储程序,并打印出新的“选择书签”条目。

如果已经做出选择,则需要一些额外的处理来阻止线程打印任何内容,在线程之间共享变量等,但这是一般的想法。

另一种选择是通过事件处理来处理这个问题。您基本上会同时拥有输入(使用 Term::ReadLine 中的事件处理 - 请参阅 Term::ReadLine::Event 了解如何使用各种事件模块执行此操作)和 ssh。这避免了一些线程共享等,因为所有事情都发生在同一个线程中。

无论哪种方式,你的脚本都会变得不那么简单,你最好在开始时打印出“正在收集信息,请稍候”,收集所有选项,包括本地和远程选项,然后打印出选项。从成本/ yield 的角度来看,就是这样。

祝你好运。

关于perl - 等待远程数据时读取STDIN;下载远程数据时终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39307355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com