Perl:将多行文本重定向到编辑器并将 return 编辑的文本重定向到变量

Perl: redirect multi line text to editor and return edited text into variable

有没有什么方法可以将变量中的多行文本打印到某些编辑器,并且在退出时将 return 编辑的文本输出到脚本?

喜欢:

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

好的,我突然找到方法了。 'moreutils' 包中有一个 'vipe' 工具。所以在 sudo apt-get install moreutils 之后(在我的例子中系统是 Ubuntu)代码应该变成:

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

在我的例子中,默认编辑器是 Vim(在我的系统中,vipe 使用来自 'EDITOR' 环境变量的编辑器,如果 'EDITOR' 未定义,则回滚到 vi),所以文本在“/tmp”中的临时文件下的 Vim 中打开 - 在 :wq Vim 命令后编辑器关闭,临时文件被删除,内容 return 到 '$结果'变量。太棒了!

在我看来 Term::CallEditor 可能是一个不错的方法。 vipe 可以从 moreutils 包中获得,可以使用包管理器安装它,但它不在 CPAN 上。 Term::CallEditor 在 CPAN 上可用,也可能被许多包管理存储库采用。

vipemoreutils 调用 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 上。

Proc::InvokeEditor 是另一个在这方面做得很好的模块。