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

jms*_*980 3 perl

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

#!/bin/perl -w

use strict;

$[ = 1;    # set array base to 1
$, = ' ';    # set output field separator
$\ = "\n";    # set output record separator
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行该脚本时,我收到以下错误消息:

Use of assignment to $[ is deprecated at ./test.pl line 5.
Run Code Online (Sandbox Code Playgroud)

有关如何解决此问题的任何想法?

我使用的是以下版本的perl:

This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 10

使用$[已被劝阻,弃用,但几乎不允许使用.在perlvar中看到(它在Deprecated and Removed Variables部分中)并查看它被移动的核心arybase.

但是,如果必须,您可以禁用此特定警告类别

use strict;
use warnings;

# Restrict the scope as much as possible
{ 
    no warnings 'deprecated';
    $[ = 1;

    # ...
}
Run Code Online (Sandbox Code Playgroud)

现在它不会打印出那个警告,它会起作用,因为它仍然是合法的.

请注意,这也会更改其他偏移量,例如字符串,但还不包括其他偏移量.这是一个非常非常古老的"功能",请阅读文档.

如果可能的话,我强烈建议重写脚本.


mob*_*mob 5

该模块Array::Base在现代版本的perl中实现了数组索引偏移功能。对于自约束脚本,请以

use Array::Base (1);
Run Code Online (Sandbox Code Playgroud)

应该表现得与旧版脚本非常相似

$[ = 1;
Run Code Online (Sandbox Code Playgroud)

在顶部,但请参阅文档以了解一些潜在的重要免责声明


小智 4

短期:您可以通过将-w第一行中的标志(启用某些警告)替换为-X(禁用所有警告)来消除此警告。

长期:这个脚本可能只需要完全重写。$[自 Perl 5.0 发布(1994 年!!)以来,不鼓励使用变量(数组基索引);它出现在这个文件中意味着它确实很旧了。

  • @duskwuff:我认为你和我对“面向未来”的定义可能不同。:-P (7认同)
  • 最好在本地抑制警告:`{ no warnings; $[ = 1; }`。将“-w”保留在适当的位置,或者更好地将其替换为“use warnings;”。 (5认同)