30分プログラムをYAMLに

30分プログラム、その217。過去の30分プログラムをYAMLでリストアップするプログラム。

文字列の比較にeqを使わないといけないことを忘れてて、だいぶ悩んだ。
配列から要素を削除する関数が分からなくてgrepで実現してるけど、これができる関数あるのかなぁ。配列操作の比較表には載ってないけど。

使い方

$ perl collect.pl *.txt
---
category:
  - Python
title: cat -n
url: http://d.hatena.ne.jp/mzp/20080101/cat
---
category:
  - Python
title: SQLiteをPythonで
url: http://d.hatena.ne.jp/mzp/20080102/sqlite
---
category:
  - Python
title: tail -f
url: http://d.hatena.ne.jp/mzp/20080103/tail
---
category:
  - Python
title: 複素数計算
url: http://d.hatena.ne.jp/mzp/20080105/complex
---

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# collect.pl -
#
# Copyright(C) 2008 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2008/01/07 15:51:13
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#
use strict;
use warnings;
use YAML;

sub url($){
    my ($filename) = @_;
    $filename =~ /(\d{4})-(\d{2})-(\d{2})\.txt$/ or die "filename is invalid";
    "http://d.hatena.ne.jp/mzp/$1$2$3";
}

sub extract($){
    my ($filename) = @_;
    open(FILE,$filename);
    my @titles = grep {/\*.*\[30分プログラム/ } <FILE>;
    close(FILE);

    map {
	/^
	    \*(\w+)\*      # *hoge*のような記事ID
	    (\[[^.]+\])*   # [...]のようなカテゴリ
	    (.*)	   # タイトル
	    /x or die 'invalid title format';
	my ($id,$category,$title) = ($1,$2,$3);
	my ($dummy,@cat) =
	    grep { $_ ne '30分プログラム'} split /[\[\]]+/,$category;
	my $url = url($filename);

	{
	    url      => "$url/$id",
	    title    => $title,
	    category => \@cat
	}
    } @titles;
}

my @files = map { extract $_ } @ARGV;
print Dump(@files);