Perl中dirhandle上的“stat”的语义是什么?

Perl中dirhandle上的“stat”的语义是什么?,perl,stat,Perl,Stat,在研究另一个问题时,我注意到Perl中的stat函数可以将dirhandle作为其参数,而不是filehandle或filename 然而,我找不到任何正确使用这个的例子——Perl手册中没有 有人能举例说明如何使用它吗?您使用它就像在文件句柄上统计一样: <~> $ mkdir -v foo ; perl -e 'opendir($dh , "./foo"); @s = stat $dh; print "@s"' mkdir: created directory `foo' 204

在研究另一个问题时,我注意到Perl中的stat函数可以将dirhandle作为其参数,而不是filehandle或filename

然而,我找不到任何正确使用这个的例子——Perl手册中没有


有人能举例说明如何使用它吗?

您使用它就像在文件句柄上统计一样:

<~> $ mkdir -v foo ; perl -e 'opendir($dh , "./foo"); @s = stat $dh; print "@s"'
mkdir: created directory `foo'
2049 11681802 16877 2 1001 1001 0 4096 1228059876 1228059876 1228059876 4096 8
#!/usr/bin/perl
use strict;

my $dir = shift;
opendir(DIR, $dir) or die "Failed to open $dir: $!\n";
my @stats = stat DIR;
closedir(DIR);
my $atime = scalar localtime $stats[8];

print "Last access time on $dir: $atime\n";

就我个人而言,我喜欢使用File::stat获得好的命名访问器,这样我就不必记住或查找第五个元素是UID…

您使用它就像在文件句柄上使用stat一样:

<~> $ mkdir -v foo ; perl -e 'opendir($dh , "./foo"); @s = stat $dh; print "@s"'
mkdir: created directory `foo'
2049 11681802 16877 2 1001 1001 0 4096 1228059876 1228059876 1228059876 4096 8
#!/usr/bin/perl
use strict;

my $dir = shift;
opendir(DIR, $dir) or die "Failed to open $dir: $!\n";
my @stats = stat DIR;
closedir(DIR);
my $atime = scalar localtime $stats[8];

print "Last access time on $dir: $atime\n";

就我个人而言,我喜欢使用File::stat来获得好的命名访问器,这样我就不必记住或查找第五个元素是UID…

您使用它的方式与使用文件或文件句柄的方式相同:

<~> $ mkdir -v foo ; perl -e 'opendir($dh , "./foo"); @s = stat $dh; print "@s"'
mkdir: created directory `foo'
2049 11681802 16877 2 1001 1001 0 4096 1228059876 1228059876 1228059876 4096 8
#!/usr/bin/perl
use strict;

my $dir = shift;
opendir(DIR, $dir) or die "Failed to open $dir: $!\n";
my @stats = stat DIR;
closedir(DIR);
my $atime = scalar localtime $stats[8];

print "Last access time on $dir: $atime\n";

在目录句柄上使用stat的功能是在Perl 5.10中添加的,因此如果您关心可移植性,应该避免使用stat。

您使用它的方式与使用文件或文件句柄的方式相同:

<~> $ mkdir -v foo ; perl -e 'opendir($dh , "./foo"); @s = stat $dh; print "@s"'
mkdir: created directory `foo'
2049 11681802 16877 2 1001 1001 0 4096 1228059876 1228059876 1228059876 4096 8
#!/usr/bin/perl
use strict;

my $dir = shift;
opendir(DIR, $dir) or die "Failed to open $dir: $!\n";
my @stats = stat DIR;
closedir(DIR);
my $atime = scalar localtime $stats[8];

print "Last access time on $dir: $atime\n";

在目录句柄上使用stat的功能是在Perl 5.10中添加的,因此如果您关心可移植性,就应该避免使用它。

请注意,如果句柄用作文件句柄以及dirhandle,stat将应用于文件,而不是目录:

$ perl -wl
opendir $h, "." or die;
open $h, "/etc/services" or die;
print "dir:".readdir($h);
print "file:".readline($h);
print stat("/etc/services");
print stat(".");
print stat($h);
close($h);
print stat($h);
__END__
dir:.
file:# Network services, Internet style

205527886633188100018274122800783211967194861209994037409640
20551515522168777410001000020480122803711512280371021228037102409640
205527886633188100018274122800783211967194861209994037409640
stat() on closed filehandle $h at - line 1.
    (Are you trying to call stat() on dirhandle $h?)

请注意,如果句柄用作filehandle和dirhandle,stat将应用于文件,而不是目录:

$ perl -wl
opendir $h, "." or die;
open $h, "/etc/services" or die;
print "dir:".readdir($h);
print "file:".readline($h);
print stat("/etc/services");
print stat(".");
print stat($h);
close($h);
print stat($h);
__END__
dir:.
file:# Network services, Internet style

205527886633188100018274122800783211967194861209994037409640
20551515522168777410001000020480122803711512280371021228037102409640
205527886633188100018274122800783211967194861209994037409640
stat() on closed filehandle $h at - line 1.
    (Are you trying to call stat() on dirhandle $h?)

我在WindowsActivePerl上使用Perl5.10.1,在dirhandle上执行stat不起作用。但是对目录的路径字符串进行统计是可行的

作品 这并不意味着dirfd函数没有实现。。。
我在WindowsActivePerl上使用Perl5.10.1,在dirhandle上执行stat不起作用。但是对目录的路径字符串进行统计是可行的

作品 这并不意味着dirfd函数没有实现。。。
所以它只是统计目录本身,与readdir无关?@Alnitak:没错,它与stat$dir相同,就像stat FILEHANDLE与stat$file相同。所以它只是统计目录本身,与readdir无关?@Alnitak:没错,它与stat$dir相同,正如stat FILEHANDLE与stat$file相同。