如何解决警告“使用赋值给$ [已弃用”?

时间:2016-12-20 00:57:53

标签: perl

我有一个程序,我从较旧的计算机下载到较新的计算机。它有以下代码片段:

#!/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

4 个答案:

答案 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仍然可以使用。