アプリ版:「スタンプのみでお礼する」機能のリリースについて

http://www.shoeisha.com/book/pc/dic/perlcgi.asp
こちらのサンプルソース(14_bbs/bbs2.cgi)で出てきたのですが、
掲示板のプログラムでいまいち分からないところがありました。
ちなみにmsg/ディレクトリには掲示板のログファイルがあります。
ファイル名は20030421153719_1504といった年月日に
アンダースコアを挟んでプロセスIDをくっつけたものですが、
質問には関係ないかも知れません。

my $logDir = "msg/";


省略


sub getLogFiles {
my @tmpfiles = ();
while (my $tmp = <${logDir}*>) {
$tmp =~ s/^${logDir}//;
if($tmp =~ /^\d{14}_\d+$/) { push(@tmpfiles, $tmp); }
}

省略

}

とあります。
サブルーチン内にある
while (my $tmp = <${logDir}*>) {
は変数を代入すると
while (my $tmp = <msg/*>) {
でしょうがそれでも意味が分かりません。
しらべても<>はファイルハンドラ以外の用途はあまり見かけません。
*の意味も正規表現か何かかとも考えましたがよく理解出来ません。
ちょっとわかりにくい質問かも知れませんが、
どうか宜しくお願いします。

A 回答 (2件)

ファイルグロブといって、任意のディレクトリ内のファイル名(., .. etc をのぞく)を取得するのに使います。



* はワイルドカードです。その部分は何でもいいということだと思います。

my @filenames = <${logDir}*.txt>;

とすれば txt を拡張子とするファイル名のみが @filenames に代入されます。

参考URL:http://program.station.ez-net.jp/mini/file/perl/ …
    • good
    • 0
この回答へのお礼

.,..をのぞくということはディレクトリオープンより手間が省けますね。リストで返すのですね。分かりやすくて大変参考になりました。

お礼日時:2007/02/04 14:23

"msg/" ディレクトリ内の(ファイル|ディレクトリ)名を取り出しています。


ファイルを読むときと同じように、$tmp に(ファイル|ディレクトリ)名がループ毎に入ります。
*が付いているのは所謂ワイルドカードです。

my $dir = '/ディレクトリのパス/*';
while (my $file = <${dir}>) {
print $file, "\n";
}
とすれば、ディレクトリにある、ファイルやディレクトリが表示されます。
下のように書いても良いと思います。
while (my $file = glob $dir) {

もちろん、
print <${dir}>;
こういう書き方も出来ます。
    • good
    • 0
この回答へのお礼

なるほど、それは便利ですね。これまではディレクトリオープンでどうにゃらこうにゃらしてましたがこっちの方が簡単そうですね。詳しい説明をありがとうございました。

お礼日時:2007/02/04 14:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!