2016-12-20 16 views
3

古いコンピュータから新しいコンピュータにダウンロードしたプログラムがあります。どのようにこの問題を解決するために

Use of assignment to $[ is deprecated at ./test.pl line 5. 

上の任意のアイデア:私は、次のエラーメッセージが表示されますスクリプトを実行しようとすると、しかし

#!/bin/perl -w 

use strict; 

$[ = 1; # set array base to 1 
$, = ' '; # set output field separator 
$\ = "\n"; # set output record separator 

:それは、次のコードスニペットを持っていますか?

私はperlの次のバージョンの使用しています:

This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi 
+0

「この問題を解決する方法はありますか? * PerlがPascal *ではないという事実を条件にしてください。 –

答えて

1

短期を:あなたは-Xとの最初の行に-wフラグ(いくつかの警告を有効)を交換することにより、この警告を消すことができます(すべての警告を無効にします) 。

長期:このスクリプトは、おそらく完全に書き換える必要があります。 $[変数(配列ベースインデックス)の使用は、Perl 5.0のリリース以来(1994年には!!)避けられました。このファイルに存在することは、実際には非常に古いものでなければならないことを意味します。

+5

警告をローカルに表示しない方が良いでしょう。 '{警告なし。 $ [= 1; } '。 '-w'を適切な場所に置いてください。それよりも' use warnings; 'で置き換える方がいいでしょう。 @KeithThompson True。 –

+0

一方、スクリプトで使用されている他の廃止された機能のいずれかが後で廃止される場合は、futureproofingです... – duskwuff

+6

@duskwuff:私はあなたと私が "futureproofing"を異なって定義するかもしれないと思います。 :-P – ruakh

6

$[の使用は推奨されず、推奨されておらず、all but disallowedです。 it in perlvarDeprecated and Removed Variablesセクションにあります)を参照し、移動したコアarybaseを参照してください。

それでも、あなたがする必要がある場合は、この特定のwarning category

use strict; 
use warnings; 

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

    # ... 
} 

は、今ではその警告を表示しません無効にすることができ、そしてそれはまだ合法であるので、それが動作します。

この例では、文字列の他のオフセットも変更されていますが、ではなく、であることに注意してください。それは非常に古い "機能"ですので、ドキュメントをお読みください。

可能であれば、スクリプトを書き直すことを強くお勧めします。

3

モジュールArray::Baseは、Perlの最近のバージョンで配列インデックスオフセット機能を実現します。自己制約スクリプトの場合は、上部の

$[ = 1; 

を言う古いスクリプトにかなり同じように動作しますが、いくつかのpotentially important disclaimersのためのドキュメントを参照する必要があり

use Array::Base (1); 

でスクリプトを開始します。

関連する問題