为什么我的文件句柄的chdir在Perl中不起作用?

时间:2009-11-13 16:44:17

标签: perl chdir

当我尝试使用文件句柄作为参数的“chdir”时,“chdir”返回0并且pwd仍然返回相同的目录。应该这样吗?

我试过这个,因为在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。

3 个答案:

答案 0 :(得分:8)

它也说

It returns true upon success, false otherwise.

表示您对chdir的调用失败。检查$!变量以获取有关发生的事情的线索。由于您没有收到致命的运行时错误,因此您不必担心关于fchdir的最后一段。

<小时/>

运行几个测试,我看到chdir FILEHANDLEFILEHANDLE引用目录时有效,但在常规文件中没有。希望有所帮助:

  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

答案 1 :(得分: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
The fchdir function is unimplemented at C:\Temp\k.pl line 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

答案 2 :(得分:0)

适合我。 Windows不支持fchdir,实际上它是一个致命的错误:

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

产生致命错误。所以看起来在完全没有fchdir支持的系统上它适用于规范。看起来可以清除措辞,特别是“可能”这个词。