Learning Perl Objects, References amp;amp; Modules [Electronic resources] نسخه متنی

اینجــــا یک کتابخانه دیجیتالی است

با بیش از 100000 منبع الکترونیکی رایگان به زبان فارسی ، عربی و انگلیسی

Learning Perl Objects, References amp;amp; Modules [Electronic resources] - نسخه متنی

Randal L. Schwartz

| نمايش فراداده ، افزودن یک نقد و بررسی
افزودن به کتابخانه شخصی
ارسال به دوستان
جستجو در متن کتاب
بیشتر
تنظیمات قلم

فونت

اندازه قلم

+ - پیش فرض

حالت نمایش

روز نیمروز شب
جستجو در لغت نامه
بیشتر
لیست موضوعات
توضیحات
افزودن یادداشت جدید














6.8 Exercise


The answers for all exercises can be found in Section A.5.


6.8.1 Exercise [30 min]


The Professor modified some files on
Monday afternoon, and now he's forgotten which ones
they were. This happens all the time. He wants you to make a
subroutine called gather_mtime_between, which,
given a starting and ending timestamp, returns a pair of coderefs.
The first one will be used with File::Find to
gather the names of only the items that were modified between those
two times; the second one should return the list of items found.

Here's some code to try; it should list only items
that were last modified on the most recent Monday, although you could
easily change it to work with a different day. (You
don't have to type all of this code. This program
should be available as the file named ex6-1.plx in
the downloadable files, available on the O'Reilly
web site.)

Hint: You can find a
file's timestamp (mtime) with
code such as:

 my $timestamp = (stat $file_name)[9];

Because it's a slice, remember that those
parentheses are mandatory. Don't forget that the
working directory inside the callback isn't
necessarily the starting directory in which find
was called.

use File::Find;
use Time::Local;
my $target_dow = 1; # Sunday is 0, Monday is 1, ...
my @starting_directories = (".");
my $seconds_per_day = 24 * 60 * 60;
my($sec, $min, $hour, $day, $mon, $yr, $dow) = localtime;
my $start = timelocal(0, 0, 0, $day, $mon, $yr); # midnight today
while ($dow != $target_dow) {
# Back up one day
$start -= $seconds_per_day; # hope no DST! :-)
if (--$dow < 0) {
$dow += 7;
}
}
my $stop = $start + $seconds_per_day;
my($gather, $yield) = gather_mtime_between($start, $stop);
find($gather, @starting_directories);
my @files = $yield->( );
for my $file (@files) {
my $mtime = (stat $file)[9]; # mtime via slice
my $when = localtime $mtime;
print "$when: $file\n";
}

Note the comment about DST. In many parts
of the world, on the days when daylight savings time or summer time
kicks in and out, the day is no longer 86,400 seconds long. The
program glosses over this issue, but a more pedantic coder might take
it into consideration appropriately.



/ 199