perl

ECS 4.0とCGI::ApplicationでWebアプリを作る #05

UTF8フラグが付いていると、テンプレートに渡したときに文字化けするので、UTF8フラグを落とす。 sub get_browse_node { my ($self, $browse_node_id) = @_; my $browse_node_file = File::Spec->catfile( $self->param("browse_node_dir"), "$browse_node_i…

ECS 4.0 + CGI::ApplicationでWebアプリを作る #04

とりあえずトップページを表示するところまで完成。が、行き当たりばったりなもので、明日には少しばかり中身が変わっているかもしれない。 # トップレベルのブラウズノードとその子ノードを表示 sub do_index { my $self = shift; # テンプレートに渡すデー…

ECS 4.0 + CGI::ApplicationでWebアプリを作る #03

設定ファイルを使うのを止めて、トップレベルのブラウズノードだけ別ファイルから読み込むことにする。 sub cgiapp_init { my $self = shift; # トップレベルのノードのリストを読み込む eval { $self->{__TOP_LEVEL_NODE_LIST} = YAML::Syck::LoadFile("top…

ECS 4.0 + CGI::ApplicationでWebアプリを作る #02

変数は直接記述せずに、設定ファイルから読み込むことにする。 # 設定ファイルにYAMLファイルを使用するためのプラグイン use CGI::Application::Plugin::Config::YAML; # インスタンス作成時に呼び出されるメソッド sub cgiapp_init { my $self = shift; # …

ECS 4.0 + CGI::AppplicationでWebアプリを作る #01

CGI::ApplicationはWebアプリを作るためのフレームワーク。やることは大きく分けて三つ。 何種類のページを作るかを決める 各ページに対応するメソッドを、CGI::Applicationのサブクラスで定義する。 2のクラスのインスタンスを作成し、runメソッドを呼び出…

GetOpt::Longでコマンドラインオプションを処理する

引数を取らないオプション use Getopt::Long; my $flag = 0; my $count = 0; GetOptions( "flag" => \$flag, # --flagで$flagを1にする "flag!" => \$flag, # --noflagで$flagを0にする(反転オプション) "count+" => \$count # --countの数だけ$countを増…

バッファリング

バッファとはデータを一時的に保存しておく場所。バッファリングとはデータをバッファに保存すること。print関数はバッファリングを行い、データがある程度溜まってから、まとめて出力するようになっている。 ファイルに出力する場合は一定のバイト数を超え…

配列の各要素を組み合わせて二次元配列を作る

#!/usr/bin/perl use strict; use warnings; use Data::Dump qw(dump); my @al = qw(1 2 3); my @bl = qw(a b c); my @list; for my $a (@al) { for $b (@bl) { push @list, [$a, $b] } } print dump(@list); ( [1, "a"], [1, "b"], [1, "c"], [2, "a"], [2,…

CGIでセッションを使用する

#!/usr/bin/perl use strict; use warnings; use CGI; use CGI::Cookie; use CGI::Session; my $q = CGI->new; # セッションIDを取得 my $sid = $q->param("CGISESSID") || undef; # セッションIDからCGI::Sessionオブジェクトを作成 my $session = CGI::Ses…

Amazonからデータを取得して、ハッシュに変換する

というモジュールを作ってみた。XML::SimpleやXML::LibXML::Simpleを使った方が楽なんだけど、 $xml->{BrowseNodeResponse}->{BrowseNodes}->{BrowseNode}; というふうに書くのが面倒なので、XML::LibXMLを使って任意のハッシュデータを作るようにしてみた。…

型グロブとシンボリックリファレンスで動的にメソッドを追加する

#!/usr/bin/perl use strict; use warnings; package Hoge; sub new { my $class = shift; return bless {}, $class; } sub mk_accessor { my ($self, $accessor) = @_; my $class = ref $self || $self; my $code = sub { my $self = shift; $self->{$acces…

型グロブ

型グロブは識別子の前に*を付けて表し、別名を付ける時などに使う。 *bar = *foo; これで、fooという識別子でアクセスできる変数やサブルーチンに、barという識別子でもアクセスできるようになる。 $foo = "hoge"; @foo = (1, 2, 3); %foo = (a => 1, b => 2…

シンボリックリファレンス

例えば、$strの値が"hoge"だとして、 print $$str; # $hogeの値を表示 push @$str, 1; # @hogeに要素を追加 $str->{a} = 1; # $hoge{a}に代入 &$str(); # &hoge()を呼び出す というようなことができるのが、シンボリックリファレンス。使い方は普通のリファ…

リストの中に要素Xがあるかどうかを調べる

sub search { my ($val, @list) = @_; return scalar (grep { $_ eq $val } @list); } print search("a", qw(b c d a g)); #=> 1 print search("a", qw(b c d e g)); #=> 0

XML::Simpleで配列で読み込む要素を指定する

<bookmarks> <bookmark> <title>xxxx</title> <url>http://www.xxxx.com</url> <tag>x1</tag> <tag>x2</tag> </bookmark> <bookmark> <title>yyyy</title> <url>http://www.yyyy.com</url> <tag>y1</tag> </bookmark> </bookmarks> 同じ名前の要素が二つ以上ある場合だけを配列として読み込む my $xs = XML::Simple->new; my $xml = $xs->XMLin($content…

Template-ToolkitとXML::Simpleで文字化けする件

#!/usr/bin/perl use strict; use warnings; use Template; use URI; use LWP::Simple; use XML::Simple; my $uri = URI->new("http://webservices.amazon.co.jp/onca/xml"); $uri->query_form( Service => "AWSECommerceService", Version => "2008-04-07",…

Template-Toolkitのごくごく基本的な使い方

まず、Perlプログラムを書く。 #!/usr/bin/perl use strict; use warnings; use Template; # テンプレート用の変数(ハッシュリファレンス) my $vars = { browse_node => { id => "502720", name => "ブラウザ", ancestors => [ {id => "492332", name => "…

クラス定義の基礎の基礎

#!/usr/bin/perl use strict; use warnings; # クラス宣言 package Hoge; # コンストラクタ sub new { # 最初の引数はクラス名 my $class = shift; my $name = shift; # 無名ハッシュのリファレンスを作る # ハッシュの要素がインスタンス変数になる my $sel…

ハッシュの配列とかハッシュの配列とか

そういうのはリファレンスを使って作る。 #!/usr/bin/perl $data = [ { title => "xxxxxxx", url => "http://xxxxxx", tags => ["x", "xx", "xxx"] }, { title => "yyyyyyy", url => "http://yyyyyy", tags => ["y", "yy", "yyy"] }, { title => "zzzzzzz", …

リファレンス作り方・使い方

変数名の前に\を付ける $str = "hoge"; @list = (1, 2, 3); %hash = (a => 1, b => 2, c => 3); sub add1 { (shift @_) + 1 }; $str_ref = \$str; $list_ref = \@list; $hash_ref = \%hash; $sub_ref = \%add1; print $str_ref; #=> SCALAR(0x100128d8) prin…

リファレンスとはなんぞや

データを入れる箱を変数とする。その箱のアドレスがリファレンス。 リファレンスが指す箱の中にあるデータにアクセスすることがデリファレンス。 ちなみに変数は箱に付けた名前。 変数を使った代入 $a = 5; $b = $a; $b = 0; print $a; #=> 5 print $b; #=> …

WebService::Simpleでキャッシュを使えない -解決-

とりあえず解決したのでメモ。 #!/usr/bin/perl use strict; use warnings; use WebService::Simple; use Data::Dumper; { package MyCache; use Cache::File; use Safe; use base qw(Cache::File); my $safe = Safe->new; $safe->permit(qw(:default requir…

WebService::Simpleでキャッシュを使えない

#!/usr/bin/perl use strict; use warnings; use WebService::Simple; use Data::Dumper; use Cache::File; my $cache = Cache::File->new( cache_root => "$ENV{HOME}/tmp", lock_level => Cache::File::LOCK_LOCAL(), default_expires => '30 min', ); my …

Perlで何か作ってみる

何もすることがないので、とりあえずPerlで何か作ってみる。 どうせ作るなら人に使ってもらえるものがいいので、Webアプリを作ろうと思う。 とりあえずサーバが必要らしいので、XREAで借りることにした。