在终端中编写多行程序

Perl单行脚本非常实用,我在工作时每天都会写好几个。无论是测试新模块是否编译,检查函数的语法,还是编辑文件,单行脚本都能解决问题。有时当需要做更复杂的事情时,而不是写单行脚本,我会写一个临时脚本。当然,我通常忘记删除脚本,这就是为什么我的机器上充满了像‘tmp.pl’,‘getname.pl’等Perl文件。但后来我找到了一种更好的方法——使用shell here-doc!

Shell here-docs

在终端中,我可以使用here-doc语法在命令行中编写整个Perl脚本。以下是一个示例,使用HTTP::Tiny来打印出此网站返回的HTTP头信息。

$ perl - <<'EOF'
> use HTTP::Tiny;
> use Data::Dumper;
> my $res = HTTP::Tiny->new->get('http://perltricks.com/');
> print Dumper($res->{headers});
> EOF

这里发生了什么?perl -语法使Perl准备执行STDIN。shell here-doc的语法是<<'word',其中“word”是用于终止here-doc的值(我倾向于使用EOFEND)。在输入第一行并按回车后,shell光标将移动到新行,前面带有>。它看起来像这样

$ perl - <<'EOF'
> 

此时,您可以输入Perl脚本的行,按回车键换行。或者,您可以将代码从现有脚本粘贴进来。在输入终止词的新行后,终端将通过STDIN将脚本发送给perl。与单行脚本不同,您可以在程序文本中自由使用单引号和双引号。太棒了!

如果我想使用shell参数扩展,我将终止符未加引号

$ perl - <<EOF
> print "$HOME\n"
> EOF
/home/dfarrell

现在,我可以在终端中编写临时脚本,而不会在我的硬盘上到处都是。就像其他成功的命令一样,Bash会将其存储在历史记录中,因此您可以反复搜索、编辑和重新执行脚本。

这个技巧并不特定于Perl。可以以相同的方式在Perl 6、Python、Ruby等任何可以从STDIN执行代码的二进制文件中使用shell here-docs。

编辑技巧

假设您刚刚使用here-doc运行了一个临时脚本,现在您想编辑它并再次运行。如果您按上箭头,Bash将显示命令,但您不能再次按上箭头,否则Bash将显示上一个命令。相反,请使用左右箭头键移动到行的开头和结尾,光标将自动跳到下一行。

在编辑临时脚本时,我首先删除终止词(“EOF”或其他)。这样,当按回车键时,我就可以向脚本中添加更多行。如果您正在查找的命令是旧命令,您可以使用<Ctrl><shift>r在终端历史记录中搜索。

参考资料

  • 维基百科的here-docs条目有shell here-doc语法的示例。
  • bash手册页(man bash)有关于shell here-docs和不同类型的简洁但有用的条目。
  • 使用here-docs的更常见方式是在Perl代码内部。在perlop(官方Perl文档)中了解有关这些内容的更多信息。您可以在终端中使用perldoc perlop阅读。
  • HTTP::Tiny是一个轻量级的、快速的Perl用户代理,它随Perl(自版本5.14.0起)一起提供。您可能已经安装了它,因此您可以使用perldoc HTTP::Tiny阅读它的文档。

注意。在终端中阅读文档时,输入 /search-term<enter> 以跳转到下一个搜索匹配项。按 n 键将跳转到下一个匹配项,按 N 键将跳转到上一个匹配项。按 h 键将显示帮助页面。(所有这些假设您的终端阅读器是 less,这是常见的。)


本文最初发布在 PerlTricks.com

标签

David Farrell

David 是一名专业的程序员,他经常在 Twitter博客 上发表关于代码和编程艺术的见解。

浏览他们的文章

反馈

本文有错误?请在 GitHub 上打开一个问题或提交一个拉取请求来帮助我们。