Почему мой chdir для файловой ручки не работает в Perl? - PullRequest
1 голос
/ 13 ноября 2009

Когда я пытаюсь использовать "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 ]

8 голосов
/ 13 ноября 2009

Там также написано

It returns true upon success, false otherwise.

означает, что ваш звонок на 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
0 голосов
/ 13 ноября 2009

У меня работает. Windows не поддерживает fchdir, и на самом деле это фатальная ошибка:

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

выдает фатальную ошибку. Так что похоже на системы, которые вообще не поддерживают fchdir, это работает по спецификации. Похоже, формулировка может быть прояснена, особенно слово «мог бы».

0 голосов
/ 13 ноября 2009

Какая версия perl? Какая операционная система?

5.10.1 в Windows:

#!/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.

5.10.1 в Linux (/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
...