こっちの方がいいか。
#!/usr/bin/perl
# === use ===
use strict;
use warnings;
# 引数が指定されていなければ終了
exit if ($#ARGV == -1);
# 検索するディレクトリの指定(絶対パス)
my $init_dir = "/Users/simoom634/Documents/hatena/";
# 表示させる個数
my $num = 3;
# ファイル名を格納する配列
my @filenames;
# 出力用文字列を格納する配列
my @outputs;
# 検索する文字列格納用変数(正規表現可能)
my $expr = shift();
# サブルーチンの呼び出し
# -->ファイル名の列挙
&list($init_dir);
# サブルーチンの呼び出し
# -->整形して、@outputsに格納
&prnt_titles(@filenames);
if (($num + 1) < @outputs) {
print ($outputs[]);
for (my $i = ; $i < $num; $i++) {
print(pop(@outputs));
}
} else {
print @outputs;
}
# 終了
exit;
# ====================
# === サブルーチン ===
# ====================
# --->ファイル名列挙
# 引数として与えられたディレクトリの中から
# 「\d+」に該当するものだけを列挙して
# @filenameに格納する
sub list {
# 引数を$dirnameに代入
my $dirname = shift;
# ディレクトリを開いて、一つ一つ処理
opendir(DIR, $dirname) or die "$dirname: $!";
foreach my $entry (readdir(DIR)) {
# 隠しファイル・ディレクトリだったらパス
next if ($entry =~ /[\.]+/);
# バックアップや設定用ファイルならパス
next if ($entry =~ /[0-9]+\~/);
next if ($entry =~ /.*\@hatena/);
push @filenames, $entry;
}
closedir(DIR);
}
# --->整形して表示
# はてなのリスト形式で検索結果を表示する。
# 引数にはファイル名を格納した配列を指定する。
sub prnt_titles {
push @outputs, "- 「$expr」に関連する最近のエントリ\n";
while (@_) {
my $part_filename = shift;
# パスの区切り文字を指定
my $delim = '/';
# $dirnameの最後が「/」or「\」だったら、区切り文字をnullに
if ($init_dir =~ /[\/\\]$/) {
$delim = '';
}
# 表示
my $full_filename = "$init_dir$delim$part_filename";
open (FILE, $full_filename) or die "$!";
while (<FILE>) {
if ($_ =~ /$expr/i){
my $tmp = "-- ";
$tmp = $tmp . "[http://d.hatena.ne.jp/sirocco634/";
$tmp = $tmp . $part_filename;
$tmp = $tmp . ":title]\n";
push @outputs, $tmp;
last;
}
}
close (FILE);
}
}