有没有办法将多行文本从变量打印到某个编辑器,退出时会将编辑后的文本返回给脚本?
像:
my $result = `echo -n $txt | some_editor`;
print $file_handle $result;
答案 0 :(得分:1)
好的,我突然发现了这样做的方法。 'moreutils'包中有一个'vipe'工具。所以在sudo apt-get install moreutils
之后(在我的情况下系统是Ubuntu)代码应该变成:
my $result = `echo -n $txt | vipe`;
print $file_handle $result;
在我的情况下,默认编辑器是Vim(在我的系统vipe中使用来自'EDITOR'环境变量的编辑器,如果'EDITOR'未定义则回滚到vi),因此文本在Vim中的临时文件中打开'/ tmp' - 在:wq
Vim命令后,编辑器关闭,临时文件被删除,内容返回'$ result'变量。太好了!
答案 1 :(得分:1)
在我看来,Term::CallEditor可能是一种很好的方法。可以使用程序包管理器安装的vipe
程序包中提供moreutils
,但它不在CPAN上。 Term :: CallEditor可以在CPAN上使用,也可能被许多包管理回购接收。
vipe
的 moreutils
调用vi。 Term :: CallEditor的solicit
命令调用EDITOR
环境变量指向的编辑器,这是一种更多的* nix-y方式;这是人们普遍期待的。如果没有EDITOR
环境变量,它将回退到vi
。
来自Term :: CallEditor的POD中的SYNOPSIS
。
use Term::CallEditor qw/solicit/;
my $fh = solicit('FOO: please replace this text');
die "$Term::CallEditor::errstr\n" unless $fh;
print while <$fh>;
我喜欢solicit
尊重$ENV{'EDITOR'}
变量,例如git
的工作方式。
查看Term :: CallEditor中的代码,它实际上并不那么重要,也不复杂,但鉴于模块存在,我认为没有理由尝试自己复制边缘案例的处理。
如果vipe
也尊重$EDITOR
,那么它将归结为对每个模块提供的其他功能的评估,以及更深入的代码审核。或者只选一个并继续使用它。我仍然喜欢Term :: CallEditor,因为它在CPAN上。
答案 2 :(得分:0)
Proc::InvokeEditor是另一个可以很好地完成此任务的模块。