Perl:将多行文本重定向到编辑器并将编辑后的文本返回到变量中

时间:2015-11-07 15:25:04

标签: perl user-input text-editor multiline

有没有办法将多行文本从变量打印到某个编辑器,退出时会将编辑后的文本返回给脚本?

像:

my $result = `echo -n $txt | some_editor`;
print $file_handle $result;

3 个答案:

答案 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是另一个可以很好地完成此任务的模块。