1

ファイルハンドルを引数として「chdir」を実行しようとすると、「chdir」は 0 を返し、apwdは同じディレクトリを返します。そうすべきですか?

chdirのドキュメントで見つけたので、これを試しました:

「fchdir をサポートするシステムでは、ファイル ハンドルまたはディレクトリ ハンドルを引数として渡すことができます。fchdir をサポートしないシステムでは、ハンドルを渡すと実行時に致命的なエラーが発生します。」

後で与えられる:

#!/usr/bin/perl -w
use 5.010;
use strict;
use Cwd;

say cwd();  # /home/mm
open( my $fh, '>', '/home/mm/Documents/foto.jpg' ) or die $!;
say chdir $fh;  # 0
say cwd();  # /home/mm

これはおそらくファイルのディレクトリへのchdirになると思いましたが、ここにはDWIMがありません。

4

3 に答える 3

8

それはまた言います

成功した場合は true、それ以外の場合は false を返します。

chdirへの呼び出しが失敗したことを意味します。変数をチェックして、$!何が起こったかの手がかりを見つけてください。致命的な実行時エラーが発生しなかったので、最後の段落について心配する必要はありませんfchdir


いくつかのテストを実行すると、ディレクトリを参照chdir FILEHANDLEする場合は機能FILEHANDLEしますが、通常のファイルを参照する場合は機能しません。それが役立つことを願っています:

  open(FH, "<", "/tmp/file");  # assume this file exists
  chdir FH and print "Success 1\n" or warn "Fail 1: $!\n";
  open(FH, "<", "/tmp");
  chdir FH and print "Success 2\n" or warn "Fail 2: $!\n";
  opendir(FH, "/tmp");
  chdir FH and print "Success 3\n" or warn "Fail 3: $!\n";

 

  Fail 1: Not a directory
  Success 2
  Success 3
于 2009-11-13T16:50:49.017 に答える
0

のどのバージョンperlですか? どのオペレーティング システムですか?

Windows での 5.10.1:

#!/usr/bin/perl

use strict; use warnings;

# have to use a file because Windows does not let 
# open directories as files
# only done so I can illustrate the fatal error on
# a platform where fchdir is not implemented

open my $fh, '<', 'e:/home/test.txt'
    or die "Cannot open file: $!";

chdir $fh
    or die "Cannot chdir using filehandle: $!";

出力:

C:\Temp> k
fchdir 関数は C:\Temp\k.pl 行 9 で実装されていません。

Linux の 5.10.1 (/home/sinan/testはディレクトリ):

$ cat k.pl
#!/usr/bin/perl

use strict; use warnings;

use Cwd;

open my $fh, '<', '/home/sinan/test'
    or die "Cannot open file: $!";

chdir $fh
    or die "Cannot chdir using filehandle: $!";

print getcwd, "\n";

$ ./k.pl
/home/sinan/test
于 2009-11-13T17:02:56.030 に答える
0

私のために働きます。Windows は fchdir をサポートしておらず、実際には致命的なエラーです。

perl -we"opendir my $fh, 'temp'; chdir $fh or print 'foo'"

致命的なエラーを生成します。したがって、fchdir をまったくサポートしていないシステムでは、仕様どおりに動作するように見えます。特に「かもしれない」という言葉を明確にすることができたようです。

于 2009-11-13T17:09:21.010 に答える