我有一个输出文本的 Perl 脚本。我想将此文本导入 vim,编辑它,保存然后退出。退出时,我希望原始 Perl 脚本处理编辑后的文件。
例如,当您添加新工作时如何crontab -e
工作。
谢谢 :)
我有一个输出文本的 Perl 脚本。我想将此文本导入 vim,编辑它,保存然后退出。退出时,我希望原始 Perl 脚本处理编辑后的文件。
例如,当您添加新工作时如何crontab -e
工作。
谢谢 :)
听起来像是使用system在文件名上运行 vim 的一个非常简单的案例。这将等到 vim 完成,此时您可以继续阅读文件的新内容。
use File::Temp;
my $fh = new File::Temp();
my $fname = $fh->filename;
print $fh "My Text";
$fh->close();
system($ENV{EDITOR}, $fname);
open $fh, '<', $fname or die "Can't open temp file: $!";
while(<$fh>) { print }
close $fh;
一个建议:为什么不将源代码抓取到 crontab 并查看它的作用?
除此之外,放松有你的答案。
我认为思考这个问题的方法是:
“好的,我需要一个程序来写出一个文件,调用 vim,然后对文件进行进一步处理。所以,这是我编写文件的例程,这是我调用 vim 的例程(使用系统),这是我的例程在 vim 完成后进行后处理。现在我将它们全部连接到我的主程序中,我就完成了!
您似乎想将脚本的输出通过管道传输到 vim:
脚本 | vim
然后你希望脚本以某种方式知道 Vim 已经完成并继续。这不是 I/O 重定向的工作方式。该脚本不知道其输出被输入到哪个程序中。
您提到了其他程序,例如crontab
and cvs
; 它们的共同点之一是它们自己调用编辑器。他们创建临时文件,阅读 EDITOR 或 VISUAL 环境变量(查看手册了解他们如何选择哪个环境变量的详细信息),运行给定程序,然后等待程序完成。然后他们继续运行并使用他们之前指定的文件。
事实证明我在 Perl 中完全做到了这一点。我创建了一个临时文件(带有tempfile
),在其中写入了一堆文本,然后用于system
调用该文件的编辑器。您甚至不必在运行编辑器时关闭文件。
管道输出到vim -不要忘记最后的破折号。
script.pl | vim -
这将使用脚本输出的内容打开 vim。只需保存它:w 文件名并退出:q。这不是 crontab -e 的工作方式,但它以一种简单的方式足够接近。
编辑:
我错过了这部分(或者问题后来被编辑了):
退出时,我希望原始 Perl 脚本处理编辑后的文件。
这不是最好的方法,但是按照我的原始答案,这可行(如果您将文件保存为 file.txt):
perl -le 'print "1234"' | vim - && perl -pe '' file.txt
只需用您的 perl 命令替换 perl 命令,它应该可以工作。就像我说的,这不是最好的答案,但它应该有效。