ما هي دلالات "القانون الأساسي" على dirhandle في بيرل؟

StackOverflow https://stackoverflow.com/questions/328946

  •  11-07-2019
  •  | 
  •  

سؤال

في بحث مسألة أخرى لاحظت أن وظيفة stat في بيرل يمكن أن يستغرق وdirhandle كما حجتها (بدلا من filehandle أو اسم الملف).

ولكن لا أستطيع العثور على أي أمثلة على الاستخدام الصحيح لهذا - لا يوجد أحد في دليل بيرل

.

ويمكن لأي شخص أن تظهر مثال على كيفية استخدامه؟

هل كانت مفيدة؟

المحلول

ويمكنك استخدامها بنفس الطريقة التي لديك عن ملف أو filehandle:

#!/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";

وتمت إضافة القدرة على استخدام القانون الأساسي على مقابض دليل قاب بيرل 5.10 لذا يجب تجنبه إذا كان يهمك قابلية.

نصائح أخرى

ويمكنك استخدامه فقط وكأنك stat على filehandle:

<~> $ 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

(وأنا شخصيا أحب استخدام File::stat للحصول يمكنهم الدخول اسمه لطيفة، لدرجة أنني لا يجب أن تذكر (أو البحث) أن العنصر الخامس هو UID ...)

ومجرد أن يكون على علم بأن إذا كان مقبض أي وقت مضى تستخدم بمثابة filehandle، فضلا عن dirhandle، فإن القانون الأساسي ينطبق على الملف، لا الدليل:

$ 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?)

وأنا استخدم بيرل 5.10.1 على النوافذ (ActivePerl) والقيام القانون الأساسي على dirhandle لا يعمل. لكنه لا يفعل القانون الأساسي على السلسلة مسار أعمال الدليل.

تحليل يعمل

  my $mtime = (stat( $directory ))[ 9 ];
  print "D $directory $mtime\n";

تحليل هذا لا ( "وظيفة dirfd هي لم تنفذ ...")

  my $dh;
  if( opendir( $dh, $directory ) == 0 ) {
    print "ERROR: can't open directory '$directory': $!\n";
    return;
  }
  $mtime = (stat( $dh ))[ 9 ];
  print "D $directory $mtime\n";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top