我有一个程序,我从较旧的计算机下载到较新的计算机。它有以下代码片段:
#!/bin/perl -w
use strict;
$[ = 1; # set array base to 1
$, = ' '; # set output field separator
$\ = "\n"; # set output record separator
但是,当我尝试运行脚本时,我收到以下错误消息:
Use of assignment to $[ is deprecated at ./test.pl line 5.
有关如何解决这个问题的想法吗?
我使用的是以下版本的perl:
This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
答案 0 :(得分:8)
不鼓励使用$[
,不推荐使用all but disallowed。请参阅it in perlvar(位于Deprecated and Removed Variables部分)并查看已移动的核心arybase。
但是,如果必须,您可以停用此特定warning category
use strict;
use warnings;
# Restrict the scope as much as possible
{
no warnings 'deprecated';
$[ = 1;
# ...
}
现在它不会打印出那个警告,它会起作用,因为它仍然是合法的。
请注意,这也会更改其他偏移量,例如字符串,但不是还有其他偏移量。这是一个非常非常古老的“功能”,请阅读文档。
如果可能的话,我强烈建议重写脚本。
答案 1 :(得分:4)
模块Array::Base
在现代版本的perl中实现数组索引偏移功能。对于自我约束的脚本,使用
use Array::Base (1);
应该表现得与说
的旧脚本非常相似$[ = 1;
位于顶部,但请参阅某些potentially important disclaimers的文档。
答案 2 :(得分:1)
短期:您可以通过使用-w
替换第一行中的-X
标记(启用一些警告)来禁用此警告(禁用所有警告)。
长期:这个脚本可能只需要完全重写。自从Perl 5.0发布(1994年!!)以来,不鼓励使用$[
变量(数组基本索引);它在这个文件中的存在意味着它必须非常古老。
答案 3 :(得分:1)
Since Perl v5.30,将$[
以外的任何内容分配给0
会产生错误。 zdim答案中的解决方法不再适用。但是mob提到的模块Array::Base仍然可以使用。