--- title: 修正してみた author: kazu634 date: 2008-07-12 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4137;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - Perl - Programming ---

こっちの方がいいか。

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