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);