我有一些脚本,有时我写的时候没有意识到use v1.2.3;
它有用.所以他们中的一些可能正在使用更高版本的perl中的一些功能,其中一些可能就好了,比如perl 5.8.
现在我想把它变成某种顺序并use
在有需要的地方添加适当的s,以便能够更好地睡觉.:-)
我该怎么办?有没有什么工具可以帮我做出有根据的猜测?
在Perl 5.8下,这段代码的行为与在Perl 5.12下的行为不同:
my $badcode = sub { 1 / 0 };
print "Made it past the bad code.\n";
Run Code Online (Sandbox Code Playgroud)
当我在5.8下运行它时,即使我从未执行分区,我也会收到错误:
[brock@chase tmp]$ /usr/bin/perl -v This is perl, v5.8.8 built for i486-linux-gnu-thread-multi [brock@chase tmp]$ /usr/bin/perl badcode.pl Illegal division by zero at badcode.pl line 1. [brock@chase tmp]$ /usr/local/bin/perl -v This is perl 5, version 12, subversion 0 (v5.12.0) built for i686-linux [brock@chase tmp]$ /usr/local/bin/perl badcode.pl Made it past the bad code.
在perl 5.10.1下,它的行为与在5.12下的行为相同:
brock@laptop:/var/tmp$ perl -v This is perl, v5.10.1 (*) built …
Perl 5.10和5.12的一些新功能(例如"say")被定义为功能,您可以启用或禁止显式使用"功能"编译指示.但其他补充,如正则表达式的命名捕获组,是隐含的.
当我使用5.10+解释器编写Perl但希望它也能在5.8上运行时,我是否可以让Perl抱怨使用5.8中没有的东西?显然,最好在你打算运行的所有主要版本上测试你的代码,但让Perl自动警告我仍然很好.
根据CPAN上的Perl源代码页,5.8.9现在是14天,将是最后的5.8版本.5.10.0已超过一年,可能已准备好用于生产.
暂且不谈Perl 6的讨论,请问Perl人员在生产中测试,推出和使用的版本是什么?我们目前在Ubuntu(工作站)和Solaris(生产)平台上已经标准化了5.8.8,我想知道将5.8.9或更大的一步小到5.10.0的优点和缺点.
我知道这是可能的,但我在语法上画了一个空白.你如何做有条件的类似以下的事情.5.8,所以没有开关选项:
while ( calculate_result() != 1 ) {
my $result = calculate_result();
print "Result is $result\n";
}
Run Code Online (Sandbox Code Playgroud)
和类似的东西:
while ( my $result = calculate_result() != 1 ) {
print "Result is $result\n";
}
Run Code Online (Sandbox Code Playgroud) 我有一个表达式,我需要拆分并存储在一个数组中:
aaa="bbb{ccc}ddd" { aa="bb,cc" { a="b", c="d" } }, aaa="bbb{}" { aa="b}b" }, aaa="bbb,ccc"
Run Code Online (Sandbox Code Playgroud)
一旦拆分并存储在数组中,它应该看起来像这样:
aaa="bbb{ccc}ddd" { aa="bb,cc" { a="b", c="d" } }
aaa="bbb{}" { aa="b}b" }
aaa="bbb,ccc"
Run Code Online (Sandbox Code Playgroud)
我使用Perl版本5.8,有人可以解决这个问题吗?
我在所有服务器上安装了Perl 5.8,并希望使用DBI和DBD :: Oracle模块来访问我们的数据库.我主要担心的是更新版本的perl DBI和DBD模块将停止使用5.8.然后我必须将每台服务器升级到最新的perl版本.
我的问题是perl本身成为更高版本,并且为他们开发的模块是否仍然可以向后兼容?"如果我创建文档说运行"cpan -i DBI",如果最新版本的DBI不能与5.8一起运行,那么"CPAN不会包含Perl的所有古老版本和补丁级别".
我有一个调度表,我希望只初始化一次,并且只打算由一个函数使用.我希望将子程序之外的调度表移动到同一个匿名块中,但由于调度表使用闭包来调用传递给函数的对象的方法,因此在函数外部移动表会将其与访问对象分开.我对此调度表还有哪些其他选择?
我正在使用Perl 5.8,所以不幸的是我无法使用state
变量.
sub foo {
my ($self, $var) = @_;
my %funcs = (
a => sub { $self->_a() },
b => sub { $self->_b() },
...
);
return $funcs{$var}->();
}
Run Code Online (Sandbox Code Playgroud) 我有一个脚本(源码)来解析svn info
为Bash创建一个合适的字符串$PS1
.不幸的是,这不适用于我正在使用的运行Perl 5.8.8的系统 - 它输出所有行而不是仅输出匹配.什么是Perl 5.8.8相当于以下?
__svn_ps1()
{
local result=$(
svn info 2>/dev/null | \
perl -pe 's;^URL: .*?/((trunk)|(branches|tags)/([^/]*)).*;\2\4 ;p')
if [ -n "$result" ]
then
printf "${1:- (%s)}" $result
fi
}
Run Code Online (Sandbox Code Playgroud)
Perl 5.10的输出只包含空格,括号,分支名称,标记名称或trunk
最后括号之一.Perl 5.8.8(没有最终版本p
)的输出包含此加上svn info
输出的每个空格分隔部分的括号版本.
一个可能的解决方法涉及和命令grep '^URL: '
之间的简单,但我希望避免这种情况,因为这将针对每个Bash提示执行.svn
perl
我有这个使用perl 5.10的特殊代码(用于类似交换的操作),但是需要让它在5.8上运行.为5.8写这个是什么另一种方式?一种首选方式/技术?
for my $detail ($Details1, $Details2) {
for (keys %$detail) {
when ('file') {
print " File: $detail->{file}{path}\n";
print "Bytes: $detail->{file}{size}\n";
}
when ('directory') {
given (ref $result->{directory}) {
when ('ARRAY') {
for my $entry (@{$detail->{directory}}) {
print "Directory: $entry->{path}\n";
}
}
when ('HASH') {
print "Directory: $detail->{directory}{path}\n";
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 通过在Perl 5.6.1中开发代码但在Perl 5.8.x或5.10.x中运行代码会产生什么影响(如果有的话)?
我正在使用这些模块:
(For Linux)
HTTP::Request
HTTP::Response
LWP::UserAgent
Unicode::String
XML::DOM
DateTime::Format::DateManip
Run Code Online (Sandbox Code Playgroud)
(适用于Windows)
Unicode-String
XML-DOM
DateTime-Format-DateManip (Haven't installed this yet on Windows, still looking for package)
Run Code Online (Sandbox Code Playgroud) 我有一个大的十六进制数 - $num = 0x80000000
作为一个字符串.我想增加它,但hex($num)
由于整数溢出(出现负数),做不起作用.using bigint
也不是一个选项,因为bigint只在perl 5.10及更高版本中实现,我有5.8.我怎么能用这个字符串?
我正在编译一些与5.8和5.10之间差异有关的信息.有人可以指出主要的差异,或告诉我在哪里可以开始我的研究?