如何在 Perl 5.8.8 中使用“say”?

问题描述 投票:0回答:5

我被分配到一个需要一些审查和可能修复的项目(PHP/MySQL)。

作为它的一部分,计划检查我们通过 GET 和 POST 获得的所有变量的正确性。我们有一堆 PHP (.php) 和 Smarty (.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[...] 引用的列表,然后从中删除重复的值。但它没有用,因为我的开发机器上有 Perl 5.8.8,它不支持 5.10+ 功能“说”,我们的系统管理员说升级是不需要的。我不知道为什么,但他是老板。

那么,有没有办法用其他代码替换“say”,或者甚至用其他工具替换 Perl?

perl file bash search
5个回答
13
投票

别忘了它很容易模仿

say

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

只需将它添加到 Perl 代码的开头并像往常一样使用。


12
投票

Perl 5.10 添加了“say”,它是“print”的替代品,它会自动在输出中添加换行符。因此你可以写

say "hello";

...而不必写:

print "hello\n";

只需删除“使用功能说;”并将“say $1”替换为:

print "$1\n";

7
投票

没有八进制的

-l
选项在打印语句的末尾添加一个换行符。来自perlrun

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

的当前值

所以...

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

将取代

say
.


3
投票

但它没有用,因为我的开发机器上有 perl 5.8.8,它不支持 5.10+ 功能“say”,

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/$version 中安装了 perls 5.8.8、5.10.1、5.12.0、5.12.1、5.12.2、5.14.0、5.14.1 和 5.14.2,在 ~/ 中创建了符号链接bin(例如,perl5.8.8 是 5.8.8 perl 二进制文件的符号链接),现在我可以使用 development perls 来获得它们的新功能,同时在必要时仍然能够在旧的 perls 上进行测试。而且,因为我正在安装到我自己的主目录,所以我不需要系统管理员访问权限。如果你不在 Linux 上,你 will 需要一个编译器。 (即使在 Linux 上,您也可能需要安装一些开发包,例如,在 SLES 上,我们经常需要安装 -devel RPM 以获取额外的模块进行编译。)但是对于您的系统管理员来说,这可能比覆盖系统 perl (他警告反对是正确的)。


0
投票

在 perl 5.8 中模拟

say
的最佳方法是使用如下:

sub say { print @_?@_:$_, "\n" }

它允许许多场景,例如

say 'hi';
say for ('hello', 'world');
say for 0..9;

会产生

hi
hello
world
0
1
2
3
4
5
6
7
8
9
© www.soinside.com 2019 - 2024. All rights reserved.