• ベストアンサー

<>の意味が分かりません

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/*>) { でしょうがそれでも意味が分かりません。 しらべても<>はファイルハンドラ以外の用途はあまり見かけません。 *の意味も正規表現か何かかとも考えましたがよく理解出来ません。 ちょっとわかりにくい質問かも知れませんが、 どうか宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • SE-1
  • ベストアンサー率57% (26/45)
回答No.2

ファイルグロブといって、任意のディレクトリ内のファイル名(., .. etc をのぞく)を取得するのに使います。 * はワイルドカードです。その部分は何でもいいということだと思います。 my @filenames = <${logDir}*.txt>; とすれば txt を拡張子とするファイル名のみが @filenames に代入されます。

参考URL:
http://program.station.ez-net.jp/mini/file/perl/wildcard.asp
rupy
質問者

お礼

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

その他の回答 (1)

  • anekos
  • ベストアンサー率57% (4/7)
回答No.1

"msg/" ディレクトリ内の(ファイル|ディレクトリ)名を取り出しています。 ファイルを読むときと同じように、$tmp に(ファイル|ディレクトリ)名がループ毎に入ります。 *が付いているのは所謂ワイルドカードです。 my $dir = '/ディレクトリのパス/*'; while (my $file = <${dir}>) { print $file, "\n"; } とすれば、ディレクトリにある、ファイルやディレクトリが表示されます。 下のように書いても良いと思います。 while (my $file = glob $dir) { もちろん、 print <${dir}>; こういう書き方も出来ます。

rupy
質問者

お礼

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

関連するQ&A