はじめに
これはData::Page モジュールの紹介記事です。
http://perldoc.jp/docs/modules/Data-Page-1.01/Page.pod
実験
< Sorce >
< Output >
First page: 1 Last page: 6 Previous page: 3 Current page: 4 Next page: 5 First entry on current page: 10 Last entry on current page: 12 Current page entries: hoge10 Current page entries: hoge11 Current page entries: hoge12
(改行はよしなに入れてます)
うーん、シンプルで便利!
勉強
module本体のコードの中身もシンプルです。(VERSIONは2.02)
以下moduleを読んで気になったことのメモ。
sub new { my $class = shift; my $self = {}; bless( $self, $class ); my ( $total_entries, $entries_per_page, $current_page ) = @_; $self->total_entries( $total_entries || 0 ); $self->entries_per_page( $entries_per_page || 10 ); $self->current_page( $current_page || 1 ); return $self; }
entries_per_page
はデフォルトで10エントリーなんですね!
sub first_page { my $self = shift; return 1; }
まあそうなんだけど…これいるのかな感(;´∀`)…
# This method would probably be better named 'select' or 'slice' or # something, because it doesn't modify the array the way # CORE::splice() does. sub splice { my ( $self, $array ) = @_; my $top = @$array > $self->last ? $self->last : @$array; return () if $top == 0; # empty return @{$array}[ $self->first - 1 .. $top - 1 ]; }
ほうほう…。たしかにperlのコア機能であるspliceとはぜんぜん違う機能ですね(笑)
sub skipped { my $self = shift; my $skipped = $self->first - 1; return 0 if $skipped < 0; return $skipped; }
これはなんだろう?今あるページの一番最初のエントリーの1個前…?と思ったらDescriptionsのところに説明がありました。(Perldocにはなかった)
This method is useful paging through data in a database using SQL LIMIT clauses. It is simply $page->first - 1: $sth = $dbh->prepare( q{SELECT * FROM table ORDER BY rec_date LIMIT ?, ?} ); $sth->execute($page->skipped, $page->entries_per_page);
なるほど、LIMIT句使うときに使う想定なのね。
とはいえ上にもあるけど$page->first - 1
で十分そう。
sub change_entries_per_page { my ( $self, $new_epp ) = @_; use integer; croak("Fewer than one entry per page!") if $new_epp < 1; my $new_page = 1 + ( $self->first / $new_epp ); $self->entries_per_page($new_epp); $self->current_page($new_page); }
果たしてコードの途中で変更することってあるんだろうか…(・∀・)?
(出会ったことがない)
さいごに
It has been said before that this code is "too simple" for CPAN, but I must disagree. I have seen people write this kind of code over and over again and they always get it wrong. Perhaps now they will spend more time getting the rest of their code right...
いい言葉。ゴリゴリでバリバリに便利である必要はない。
みんなの作業が少しずつ楽になればいい。