2

ディレクトリに対していくつかの操作を実行するperlスクリプトがあり、現在のユーザー(スクリプトを実行しているユーザーなど)が所有権を持っているディレクトリで実行されるのを待つだけです。

私は次のことを試しました:

...
my $user = getlogin();
opendir(HANDLE, $path) or die ("No such directory: $path");
foreach my $directory (readdir HANDLE)
{
    opendir(WORKING_DIR_HANDLE, "$path/$directory") or die ("!!!!!!!");
    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat(WORKING_DIR_HANDLE);
    my $owner = getpwuid($uid);
    if( $owner eq $user )
    {
      ...
    }
}
...

コードはほとんどの場合機能します。ただし、stat() を呼び出すと、未定義の値が返されます。perl docs によると、私は stat() 呼び出しを正しく行っていると思います:

* stat FILEHANDLE
* stat EXPR
* stat DIRHANDLE
* stat

 Returns a 13-element list giving the status info for a file, either the file opened via
 FILEHANDLE or DIRHANDLE, or named by EXPR. If EXPR is omitted, it stats $_ . Returns the 
 empty list if stat fails. Typically used as follows:

また、ファイル名を使用して EXPR を渡そうとしましたが、同じ結果が得られました。明らかな何かが欠けているだけですか?または、これを行う別の方法はありますか?サードパーティの perl モジュールをインストールする必要のないソリューションを希望します。

4

4 に答える 4

3

stat失敗すると空のリストを返します。これにより、これらすべての変数がundefに設定されます。呼び出しの後に追加or die $!して、失敗した理由を確認します。

my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
   = stat(WORKING_DIR_HANDLE) or die $!;

失敗した理由がわかれば、修正方法がわかる場合があります。そうでない場合は、質問にエラーメッセージを追加します。

于 2010-08-23T15:48:31.787 に答える
1

エラー処理を追加してみてください。たとえば、次のようになりstatます。

if ($!) {
   warn "WRN: $path/$directory: $!";
   next;
}

スクリプトの実行に時間がかかる場合、一部のディレクトリ(およびファイル)がユーザー(またはバックグラウンドジョブ)によって移動/削除される可能性があります。

于 2010-08-23T15:50:04.893 に答える
1

を使用して、ファイル/ディレクトリが現在のユーザーによって所有されているかどうかをテストすることもできます-o

于 2010-08-23T16:57:47.907 に答える
0

stat DIRHANDLEはかなり新しい機能であり、すべてのプラットフォームで正しく利用できるわけではないことを思い出すと... perlがそれをサポートしていると確信していますか?

最初にstatEXPRを機能させることに集中することをお勧めします。

于 2010-08-23T16:10:40.700 に答える