2

私は次のコードを持っています

#!/usr/bin/perl
use Tie::File;

tie my @last_id, 'Tie::File', 'last_id.txt' or die "Unable to open this file !$i";
print @last_id[0];

exit;

last_id.txtこのような名前のファイルが含まれています

1
2
3
4
5
6

プログラムを実行しても何も出力されません。試し$last_id[0]ましたが、まだ何もありません。:/

最新のActivePerlをインストールしています。

編集:

メッセージが表示されますUnable to open this fileが、ファイルはプログラムのソースファイルと同じディレクトリにあります。

4

2 に答える 2

6

あなたが言うように、@last_id[0]間違っているので、そうあるべきです$last_id[0]。しかし、これはあなたが見ている問題を引き起こしません。

last_id.txtプログラムは、現在の作業ディレクトリでもない限り、Perlソースファイルと同じディレクトリを検索しないことに注意してください。

まず最初に、このtie行で使用されているエラー変数を次のように変更する必要があります$!

tie my @last_id, 'Tie::File', 'last_id.txt'
    or die "Unable to open this file: $!";

変数$iには有用なものが何も含まれていないためです。これにより、の失敗の理由がわかります。これは、そのようなファイルまたはディレクトリがないtieこと以外の理由である可能性があります。

またuse strictuse warningsプログラムの開始時に、見落としがちな単純なエラーにフラグを立てる必要があります。

最後に、ファイル名に絶対パスを追加して、ファイル名を完全修飾してみてください。これにより、プログラムがデフォルトで間違ったディレクトリを検索するという問題を回避できます。


アップデート

ファイルへの書き込みアクセス権がないことが問題である場合は、読み取り専用で開くことで修正できます。

定数Fcntlを定義するモジュールが必要なので、これをプログラムの先頭に配置しますO_RDONLY

use Fcntl 'O_RDONLY';

次に、tieステートメントは次のようになります

tie my @last_id, 'Tie::File', 'last_id.txt', mode => O_RDONLY
    or die "Unable to open this file: $!";
于 2012-06-15T06:15:25.283 に答える
1

絶対パスを使用すると、問題は解決するはずです

BEGIN {
    use File::Spec;
    use File::Basename qw' dirname ';
    use vars qw' $thisfile $thisdir ';
    $thisfile = File::Spec->rel2abs(__FILE__);
    $thisdir  = dirname($thisfile);
}
...
tie ... "$thisdir/last_id.txt"
于 2012-06-15T06:15:53.487 に答える