如何在Perl 5.8.8中使用'say'?

时间:2011-11-24 17:52:14

标签: perl file bash search

我被分配到一个项目(PHP / MySQL),需要一些审查和可能的修复。 作为其中的一部分,计划检查我们获得的所有变量的正确性 通过GET和POST。我们有一堆php和tpl文件有几个 代码行的所有部分都在一起,所以搜索会很痛苦 所有$ _GET [...]和$ _POST [...]手动引用。所以我试着这样做:

find . -name "*.php" -or -name "*.tpl" |
xargs perl -ne 'use feature say; say $1 while m/(\$_(GET|POST)\[[\s]*[\S]+[\s]*\])/g;' |
sort -u

基本上它会创建一个包含所有$ _GET [...]和$ _POST [...]引用的列表 项目,然后从中删除重复的值。但它没有用 因为我的开发机器上有per.8.8.8,不支持 5.10+功能'说',我们的系统管理员说升级是 不需要。我不知道为什么,但他是老板。

那么,有没有办法用其他代码替换'说',或者甚至可以替换 用另一个工具Perl?

4 个答案:

答案 0 :(得分:13)

不要忘记模仿say非常容易:

sub say { print @_, "\n" }

只需将其添加到Perl代码的开头,然后像往常一样使用。

答案 1 :(得分:10)

Perl 5.10添加了'say',它可以替代'print',自动为输出添加换行符。因此你可以写“

say "hello";

...而不必写:

print "hello\n";

只需删除'使用功能说';并用:

替换'say $ 1'
print "$1\n";

答案 2 :(得分:6)

没有八进制的-l选项会在print语句的末尾添加换行符。来自perlrun

  

启用自动行结束处理。它有两个独立的效果。   首先,它会自动选择$ /(输入记录分隔符)   与-n或-p一起使用。其次,它分配$ \(输出记录   分隔符)具有octnum的值以便任何print语句   将重新添加该分隔符。 如果省略octnum,则设置$ \   到$ / 的当前值。

所以..

perl -lne ... print $1 ...

将替换say

答案 3 :(得分:3)

  

但它没有用,因为我的开发机器上有per.8.8.8,它不支持5.10+功能'说'

Perl 5.8.8于2006年1月31日发布。从那时起,我们已经看到5.10,5.10.1,5.12,5.12.1,5.12.2,5.12.3,5.12.4,5.14, 5.14.1,5.14.2,......我可能已经过时了。自5.8.8发布以来,每个修订版都有三个主要版本(5.10,5.12,5.14)。已经发生了弃用周期,您没有机会体验它们来帮助清理您的代码。

简单的解决方案是升级。

  

我们的系统管理员说升级是不受欢迎的。我不确定为什么,但是

然后呢?这不像他是...的老板。

  他是老板。

喔。

嗯,我不是因为他们愚蠢或不正确而听老板而闻名的人。然后,我再也不提倡做我做的事情: - )

如果你的老板担心升级系统perl,他是对的。这是不受欢迎的。 (我建议购买一个较新的发行版,但是如果你是在AIX上,那么你就会陷入困境,因为新版本的AIX仍然会发布那个旧级别的perl。)但是你没有理由必须升级系统perl才能升级perl。

您可以安装多个perl。只要你不接触/ usr / bin / perl,你就不应该随时使用系统perl,你应该没问题。我在〜/ perl / $版本中安装了perls 5.8.8,5.10.1,5.12.0,5.12.2,5.12.2,5.14.0,5.14.1和5.14.2,在〜/中创建了符号链接每个bin的bin(例如,perl5.8.8是5.8.8 perl二进制文件的符号链接),现在我可以使用 development perls来获得新功能,同时仍然能够在旧的perls上进行测试必要。而且,因为我要安装到我自己的主目录,所以我不需要访问系统管理员。如果您不在Linux上,需要编译器。 (即使在Linux上,您可能需要安装一些开发包,例如,在SLES上我们经常需要安装-devel RPM来获得额外的模块进行编译。)但是,这可能是为了满足系统管理员而不是覆盖系统perl(他警告的权利。