<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-545945377522867285</id><updated>2024-10-25T13:44:54.544+09:00</updated><category term="cpan"/><category term="Mojolicious-Lite"/><category term="Carp"/><category term="Config-Simple"/><category term="DBI"/><category term="Encode"/><category term="File-FInd"/><category term="File-Path"/><category term="FindBin"/><category term="OneLiner"/><category term="Time-Piece"/><category term="WebService-YahooJapan-WebMA"/><category term="do"/><category term="hash"/><category term="utf8"/><category term="リファレンス"/><category term="基本"/><category term="特殊変数"/><title type='text'>perlめも</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-5037415466422622722</id><published>2100-01-01T22:43:00.000+09:00</published><updated>2013-10-28T01:23:30.638+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="基本"/><title type='text'>Perl Memo Index</title><content type='html'>■変数&lt;br /&gt;
□ハッシュ関係のメモ&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2012/04/blog-post.html&quot;&gt;配列からハッシュを作成する&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
□リファレンス&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2012/04/blog-post_09.html&quot;&gt;リファレンスのメモ&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
■ファイル操作&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2012/04/findbin.html&quot;&gt;実行時スクリプトのパスを取得&lt;/a&gt;&lt;br /&gt;
⇒FindBin&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2012/04/blog-post_9664.html&quot;&gt;再帰的にパスを取得する&lt;/a&gt;&lt;br /&gt;
⇒File::FInd&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2012/04/filepath.html&quot;&gt;複数階層のファイルを作成、削除&lt;/a&gt;&lt;br /&gt;
⇒File::Path&lt;br /&gt;
&lt;br /&gt;
■DB操作&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2013/10/blog-post.html&quot;&gt;DBI&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
■日付操作&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2012/03/timepiece.html&quot;&gt;日付全般の操作について&lt;/a&gt;&lt;br /&gt;
⇒Time::Piece&lt;br /&gt;
&lt;br /&gt;
■文字列操作&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2013/08/blog-post_17.html&quot;&gt;マルチバイと文字列の文字列操作のお話&lt;/a&gt;&lt;br /&gt;
⇒utf8, Encode, binmode&lt;br /&gt;
&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2012/03/webserviceyahoojapanwebma.html&quot;&gt;形態素解析&lt;/a&gt;&lt;br /&gt;
⇒WebService::YahooJapan::WebMA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
■設定ファイル&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.jp/2013/08/configsimple.html&quot;&gt;Config::SImple&lt;/a&gt;&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.jp/2013/08/blog-post.html&quot;&gt;リファレンス + do&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
■エラー処理&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2013/08/warndie-or-carpcroak.html&quot;&gt;エラー情報は、発生行？呼出し行 warn/die or carp/croak&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
■フレームワーク&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.jp/2012/09/mojoliciouslite.html&quot;&gt;Mojolicious、 Mojolicious::Lite&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
■他&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.jp/2013/08/perl.html&quot;&gt;perlの変更点が知りたい時&lt;/a&gt;&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2012/04/blog-post_08.html&quot;&gt;ワンライナー&lt;/a&gt;&lt;br /&gt;
・&lt;a href=&quot;http://program-perl.blogspot.com/2012/03/perl.html&quot;&gt;特殊変数&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/5037415466422622722/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/03/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/5037415466422622722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/5037415466422622722'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/03/blog-post.html' title='Perl Memo Index'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-6120131064419300541</id><published>2013-10-27T21:24:00.001+09:00</published><updated>2013-10-28T22:21:25.143+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DBI"/><title type='text'>DBI</title><content type='html'>まずは、接続と切断から試してみる&lt;br /&gt;
SQLiteを使うので、DBIとDBD::SQLiteがインストールされていること&lt;br /&gt;
&lt;参考&gt;&lt;br /&gt;
DBI [ver1.628]&lt;br /&gt;
DBD::SQLite [ver1.40] &lt;br /&gt;
&lt;br /&gt;
覚えること&lt;br /&gt;
&lt;table border=&quot;1&quot;&gt;&lt;tr&gt;&lt;th&gt;No&lt;/th&gt;&lt;th&gt;メソッド&lt;/th&gt;&lt;th&gt;解説&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan=&quot;2&quot;&gt;1&lt;/td&gt;&lt;td&gt;connect&lt;/td&gt;&lt;td&gt;DBに接続&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;disconnect&lt;/td&gt;&lt;td&gt;DBと切断&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan=&quot;4&quot; &gt;2&lt;/td&gt;&lt;td&gt;do&lt;/td&gt;&lt;td&gt;SQLを実行&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;prepare&lt;/td&gt;&lt;td&gt;SQLを準備&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;execute&lt;/td&gt;&lt;td&gt;SQLを実行&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; prepare_cached &lt;/td&gt;&lt;td&gt;準備した結果をcacheする&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan=&quot;3&quot; &gt;3&lt;/td&gt;&lt;td&gt;fetch&lt;/td&gt;&lt;td&gt;配列のリファレンスを返す&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;fetchrow_arrayref&lt;/td&gt;&lt;td&gt;配列のリファレンスを返す&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;fetchrow_hashref&lt;/td&gt;&lt;td&gt;列をキーに値をリファレンスで返す&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
■1.connect, disconnectメソッド&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;use strict;
use warnings;
use utf8;
use DBI;
use feature &#39;say&#39;;

my $database   = &#39;:memory:&#39;;
my $connectStr = &quot;dbi:SQLite:dbname=$database&quot;;
my $userName   = &quot;&quot;;
my $passWord   = &quot;&quot;;

#接続
my $dbh        = DBI-&gt;connect($connectStr,
                              $userName,
                              $passWord,
                              {RaiseError =&gt; 1,
                               PrintError =&gt; 0,
                               AutoCommit =&gt; 1});
#切断
$dbh-&gt;disconnect();
&lt;/pre&gt;&lt;br /&gt;
[第一引数]接続するための文字列は、&lt;br /&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;[SQLite]&lt;/td&gt;&lt;td&gt;dbi:SQLite:DB名&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;[MySQL]&lt;/td&gt;&lt;td&gt;dbi:mysql:DB名&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;[PostgreSQL]&lt;/td&gt;&lt;td&gt;dbi:pg:DB名&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;[Oracle]&lt;/td&gt;&lt;td&gt;dbi:oracle:DB名&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;尚、SQLiteはメモリ上にDBを作ることができ上記のように&lt;br /&gt;
:memory:と記載するとメモリ上に作成します。&lt;br /&gt;
当然ながら、プログラムが終了したら消えます。&lt;br /&gt;
サンプルコード等のお試しに最適です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[第二引数]username&lt;br /&gt;
[第三引数]password&lt;br /&gt;
SQLiteではユーザー名、パスワードがないので、空文字のままにしています。&lt;br /&gt;
他のDBでは設定します。&lt;br /&gt;
&lt;br /&gt;
[第四引数]オプション&lt;br /&gt;
ここは、いろいろあるのでDBIを参照するのがよいと思います。&lt;br /&gt;
http://search.cpan.org/search?query=DBI&amp;mode=all&lt;br /&gt;
&lt;br /&gt;
よく登場するオプションもメモ。&lt;br /&gt;
□RaiseError[デフォルト:偽]&lt;br /&gt;
エラーが発生すると自動的にdieして終了してくれます。&lt;br /&gt;
これを真にしないのであれば、各メソッド毎にエラー処理を書く必要があります。&lt;br /&gt;
&lt;br /&gt;
□PrintError[デフォルト:真]&lt;br /&gt;
エラー時warnで出力してくれる機能。&lt;br /&gt;
デフォルトで真だけど、RaiseErrorを真にするのであれば&lt;br /&gt;
表示内容がかぶるのでこちらは偽にしておく。&lt;br /&gt;
&lt;br /&gt;
□AutoCommti[デフォルト：真?]&lt;br /&gt;
全ての命令毎にCommitします。&lt;br /&gt;
ドライバによって、デフォルト値が異なるようですので明示的に指定した方がよいようです。&lt;br /&gt;
&lt;br /&gt;
AutoCommitが真の時、&lt;br /&gt;
一つの命令毎にCommitされるため&lt;br /&gt;
トランザクションできなくなります。&lt;br /&gt;
トランザクションを行いたい時は、明示的に指示をします。&lt;br /&gt;
&lt;br /&gt;
#ここまでAutoCommitエリア&lt;br /&gt;
&lt;br /&gt;
#ここからトランザクション開始&lt;br /&gt;
$dbh-&gt;begin_work;&lt;br /&gt;
#何かしらの処理&lt;br /&gt;
$dbh-&gt;commit(); or $dbh-&gt;rollback();&lt;br /&gt;
#トランザクション区間終了&lt;br /&gt;
&lt;br /&gt;
#ここからAutoCommitエリア&lt;br /&gt;
&lt;br /&gt;
オプションに関しては、他にも必要とするのがあるのですが&lt;br /&gt;
まずは、DBの操作について話した後でないと検証ができないので&lt;br /&gt;
のちほどあらためて掲載します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
■2.do, prepare, execute, prepare_cached&lt;br /&gt;
□doメソッド&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;my $sql = &quot;INSERT INTO sample (col1, col2) VALUES (?, ?)&quot;;
my @data = qw(data1 data2);
my $sth = $dbh-&gt;do($sql, undef, @data);
&lt;/pre&gt;&lt;br /&gt;
・ステートメントハンドルを作成しないため、SELECT文のように値を取得する場面では使えません。&lt;br /&gt;
・ステートメントハンドルを生成しない分、高速に動きます。&lt;br /&gt;
・INSERT,  UPDATE, DELETEなどなど&lt;br /&gt;
&lt;br /&gt;
□prepare, executeメソッド&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;my $sql = &quot;SELECT * FROM sample WHERE col1 = ? AND col2 = ?&quot;;
my $sth = $dbh-&gt;prepare($sql);
my @data = qw(data1 data2);
my $rv = $sth-&gt;execute(@data);
&lt;/pre&gt;・事前に準備(prepare)するため、何度もINSERTする際などループの外でprepareしておけば&lt;br /&gt;
その分高速に動きます。つまり、繰り返し同じSQLを実行する場合prepareしておけばよいということです。&lt;br /&gt;
&lt;br /&gt;
□prepare_cachedメソッド&lt;br /&gt;
prepareした物を内部でハッシュに紐づけてキャッシュします。&lt;br /&gt;
ループ分のように連続して使用するのでなく、別の関数等で再び利用する場合&lt;br /&gt;
キャッシュしておけば、prepareの行為を省略できるのでその分だけ高速になります。&lt;br /&gt;
あちこちで同じSQLを使用するのであればキャッシュして使いましょう。&lt;br /&gt;
&lt;br /&gt;
■3.fetch, fetchrow_arrayref, fetchrow_hashref&lt;br /&gt;
□fetch, fetchrow_arrayref&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;my $sql = &quot;SELECT * FROM sample&quot;;
my $sth = $dbh-&gt;prepare($sql);
my $rv  = $sth-&gt;execute();

while (my $row = $sth-&gt;fetch()){
 my ($col1, $col2, col3) = @{$row};
 #処理
}&lt;/pre&gt;fetchとfetchrow_arrayrefは同じ結果となります。&lt;br /&gt;
つまり、配列のリファレンスを返してくれます。&lt;br /&gt;
&lt;br /&gt;
□fetchrow_hashref&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;my $sql = &quot;SELECT * FROM sample&quot;;
my $sth = $dbh-&gt;prepare($sql);
my $rv  = $sth-&gt;execute();

while (my $row = $sth-&gt;fetchrow_hashref()){
    say $row-&gt;{&#39;col1&#39;};
    say $row-&gt;{&#39;col2&#39;};
    say $row-&gt;{&#39;col3&#39;};
}&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
■DBI-&gt;connectのオプションについて&lt;br /&gt;
他のオプションについても紹介しときます。&lt;br /&gt;
□ShowErrorStatement&lt;br /&gt;
エラーとなったSQLを出力します。&lt;br /&gt;
通常、行数しか表示されないためその行まで移動しないと何が原因かわからないところを&lt;br /&gt;
SQLを表示するので何でエラーとなったか把握しやすくなります。&lt;br /&gt;
&lt;br /&gt;
□DBから受け取る時、内部表現にしてくれる&lt;br /&gt;
MySQL→ mysql_enable_utf8&lt;br /&gt;
SQLite→ sqlite_unicode&lt;br /&gt;
PostgresSQL → pg_enable_utf8&lt;br /&gt;
&lt;br /&gt;
出力時自動的に内部表現から戻す処理になっているのであれば&lt;br /&gt;
DBから受け取る際に内部表現にしとく必要がありますよね。。&lt;br /&gt;
その時に役立ちます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
■サンプルコード&lt;br /&gt;
地名を５つほど登録して出力するプログラムです。&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;use strict;
use warnings;
use utf8;
use DBI;
use feature &#39;say&#39;;
binmode STDOUT, &quot;:utf8&quot;;

my $database   = &#39;:memory:&#39;;
my $connectStr = &quot;dbi:SQLite:dbname=$database&quot;;
my $userName   = &quot;&quot;;
my $passWord   = &quot;&quot;;
my $sql        = &quot;&quot;;
my $dbh        = DBI-&gt;connect($connectStr,
         $userName,
         $passWord,
         {RaiseError =&gt; 1, 
          PrintError =&gt; 0, 
          AutoCommit =&gt; 1,
          sqlite_unicode =&gt; 1
         });
#CreateTable &amp; InsertData
initialize($dbh);

$sql = &quot;SELECT * FROM test&quot;;
my $sth = $dbh-&gt;prepare($sql);
my $rv  = $sth-&gt;execute();

#arrayrefで受け取る場合
#$sth-&gt;fetchrow_arrayref()
#$sth-&gt;fetch()は、同じメソッド
while (my $row = $sth-&gt;fetch()){
 my ($id, $area) = @{$row};
 say &quot;$id:$area&quot;;
}

$sth-&gt;finish();
$dbh-&gt;disconnect();

sub initialize{
 my $dbh = shift;
    
    #テーブルを作成(idとstrの列のみ)
 my $sql = &quot;CREATE TABLE IF NOT EXISTS test(id INTEGER PRIMARY KEY AUTOINCREMENT, area TEXT)&quot;;
 $dbh-&gt;do($sql);
 
    #str列に名前を登録
 my @list = qw(興部 椴法華村 音威子府 長万部 札幌);
 $sql = &quot;INSERT INTO test (area) VALUES(?)&quot;;
 
 for my $area (@list){
  $dbh-&gt;do($sql, undef, $area);
 }
}&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/6120131064419300541/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2013/10/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/6120131064419300541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/6120131064419300541'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2013/10/blog-post.html' title='DBI'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-5959520826079740270</id><published>2013-08-18T01:00:00.001+09:00</published><updated>2013-08-18T01:32:53.340+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Carp"/><category scheme="http://www.blogger.com/atom/ns#" term="cpan"/><title type='text'>エラー情報は、発生行？呼出し行 warn/die or carp/croak</title><content type='html'>まずは、Debugモジュールを作成し、Printするメソッドを定義します。&lt;br /&gt;
ただし、Printする文字列がない時つまり引数が渡されなかったらエラーで終了としましょう！&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;                                                                              
use warnings;
use utf8;
use feature &#39;say&#39;;
binmode STDOUT, &quot;:utf8&quot;;
binmode STDERR, &quot;:utf8&quot;;

my $obj = Debug-&gt;new();
say $obj-&gt;Print(&quot;abc&quot;);
say $obj-&gt;Print(&quot;def&quot;);
say $obj-&gt;Print();
say $obj-&gt;Print(&quot;ghi&quot;);

package Debug;

sub new{                                                                                  
    return bless {}, shift;
}

sub Print{
    my ($self, $str) = @_;
    if (@_!=2){ die(&quot;引数を一つだけ指定してください&quot;) };

    return $str;
}
&lt;/pre&gt;&lt;br /&gt;
これを実行するとエラーで落ちます。&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;abc
def
引数を一つだけ指定してください at sample.pl line 22.
&lt;/pre&gt;&lt;br /&gt;
確かにエラーが発生した行の情報が表示されていて&lt;br /&gt;
これはこれで正しいのですが、あちこちから呼ばれる、データがトリガーとなって&lt;br /&gt;
エラーとなるケースでは呼び出しもとがどこなのか知りたいですよね。&lt;br /&gt;
つまり、呼び出しもとの行数を知りたい。&lt;br /&gt;
そんな時は、Carpモジュール。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;                                                                              
use warnings;
use utf8;
use feature &#39;say&#39;;
binmode STDOUT, &quot;:utf8&quot;;
binmode STDERR, &quot;:utf8&quot;;

my $obj = Debug-&gt;new();
say $obj-&gt;Print(&quot;abc&quot;);
say $obj-&gt;Print(&quot;def&quot;);
say $obj-&gt;Print();
say $obj-&gt;Print(&quot;ghi&quot;);

package Debug;
use Carp;

sub new{                                                                                  
    return bless {}, shift;
}

sub Print{
    my ($self, $str) = @_;
    if (@_!=2){ croak(&quot;引数を一つだけ指定してください&quot;) };

    return $str;
}
&lt;/pre&gt;&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush : text&quot;&gt;abc
def
引数を一つだけ指定してください at sample.pl line 11.
&lt;/pre&gt;&lt;br /&gt;
引数を一つだけ指定してください。といわれ11行を確認すると&lt;br /&gt;
say $obj-&gt;Print();&lt;br /&gt;
ならば修正するのも楽ですね。&lt;br /&gt;
&lt;br /&gt;
warnの代わりはcarpで&lt;br /&gt;
dieの代わりはcroakとなっています。&lt;br /&gt;
&lt;br /&gt;
ロジックに問題の可能性があればwarnやdieを使い&lt;br /&gt;
呼び出し元がトリガーとなる場合carpやcroakを適宜使い分ければよいと思います。</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/5959520826079740270/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2013/08/warndie-or-carpcroak.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/5959520826079740270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/5959520826079740270'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2013/08/warndie-or-carpcroak.html' title='エラー情報は、発生行？呼出し行 warn/die or carp/croak'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-4573363754791661633</id><published>2013-08-17T11:44:00.000+09:00</published><updated>2013-08-17T11:53:42.250+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Encode"/><category scheme="http://www.blogger.com/atom/ns#" term="utf8"/><title type='text'>マルチバイと文字列の文字列操作のお話</title><content type='html'>&quot;abc&quot;という文字列が何文字か調べてみましょう。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use feature &#39;say&#39;;

my $str = &quot;abc&quot;;
say $str. &quot;は、&quot;. length($str). &quot;文字です&quot;;
&lt;/pre&gt;&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;abcは、3文字です&lt;/pre&gt;&lt;br /&gt;
問題ありませんね。&lt;br /&gt;
では、&quot;あいうえお&quot;が何文字か調べてみましょう。&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use feature &#39;say&#39;;

my $str = &quot;abc&quot;;
say $str. &quot;は、&quot;. length($str). &quot;文字です&quot;;
&lt;/pre&gt;&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;あいうえおは、15文字です
&lt;/pre&gt;&lt;br /&gt;
はい、15文字ですn…&lt;br /&gt;
えぇぇぇぇぇ。それ困ります。&lt;br /&gt;
&lt;br /&gt;
このようにマルチバイト文字列の場合見た目の文字数通りカウントできないため&lt;br /&gt;
文字列操作で文字数を絡める場合問題となります。&lt;br /&gt;
そのため、見た目の文字数と一致させるためには、&lt;br /&gt;
プログラム内部で使用する&quot;内部文字列&quot;という表現に変換してあげる必要があります。&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use feature &#39;say&#39;;
use utf8;

my $str = &quot;あいうえお&quot;;
say $str. &quot;は、&quot;. length($str). &quot;文字です&quot;;
&lt;/pre&gt;&lt;br /&gt;
簡単です。use utf8;とつけただけです。&lt;br /&gt;
&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;Wide character in say at t.pl line 7.
あいうえおは、5文字です
&lt;/pre&gt;&lt;br /&gt;
５文字と表示されているので正しくカウントされました。&lt;br /&gt;
ただ、Wide character in say 〜　としかられました。&lt;br /&gt;
これは、何かというと、プログラム内部で扱う文字表現のまま出力するとおこられるのです。&lt;br /&gt;
perlの場合互換性を大事にされているので昔のプログラムもそのまま動くように配慮されているため&lt;br /&gt;
バージョンがあがってから追加された機能はいろいろ一手間加えてあげないといけないわけです。&lt;br /&gt;
&lt;br /&gt;
そんなわけで一手間加えてみます。&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use feature &#39;say&#39;;
use utf8;
binmode STDOUT, &quot;:utf8&quot;;

my $str = &quot;あいうえお&quot;;
say $str. &quot;は、&quot;. length($str). &quot;文字です&quot;;
&lt;/pre&gt;binmode STDOUT, &quot;:utf8&quot;;&lt;br /&gt;
を追加しました。&lt;br /&gt;
ターミナルへの出力(いわゆる標準出力)の際に問題となっているので&lt;br /&gt;
binmode STDOUTで標準出力を行うもの全てに対し処理が加えられます。&lt;br /&gt;
そして、ターミナルはutf8の文字列を受け付けているので:utf8として出力しています。&lt;br /&gt;
単純ですね。&lt;br /&gt;
&lt;br /&gt;
内部文字列表現かそうじゃないかは、ぱっとみわからないので判断しづらいかもしれませんが&lt;br /&gt;
ともかく、perlに文字列を渡す時に内部文字列に変換して外に出す時に元に戻すということをすればよいわけです。&lt;br /&gt;
&lt;br /&gt;
ここまでのまとめ&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg50FuDE-MOlGi-ZmH3ETQR7WyXgE6jasLc6pRyYmWP9lHOqVtXFRiM0oF9fJw6Nbr06QMapp-5bj3xlvwGSZIVwezxqDAqBU7YgVr8an11_nrE4M_Rtaxiouoq9u7VrhMKMs8U1YnihtxG/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-08-17+3.12.45.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg50FuDE-MOlGi-ZmH3ETQR7WyXgE6jasLc6pRyYmWP9lHOqVtXFRiM0oF9fJw6Nbr06QMapp-5bj3xlvwGSZIVwezxqDAqBU7YgVr8an11_nrE4M_Rtaxiouoq9u7VrhMKMs8U1YnihtxG/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-08-17+3.12.45.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
次。&lt;br /&gt;
エラー処理をしたい時warnやdieを使うと思いますが&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use feature &#39;say&#39;;
use utf8;
binmode STDOUT, &quot;:utf8&quot;;

warn(&quot;警告&quot;);
die(&quot;すっごい致命的なんです&quot;);  
&lt;/pre&gt;&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;Wide character in warn at t.pl line 7.
警告 at t.pl line 7.
Wide character in die at t.pl line 8.
すっごい致命的なんです at t.pl line 8.
&lt;/pre&gt;&lt;br /&gt;
出ました！！&lt;br /&gt;
エラー系は標準出力と異なるため、STDOUTでは太刀打ちできません。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use feature &#39;say&#39;;
use utf8;
binmode STDOUT, &quot;:utf8&quot;;
binmode STDERR, &quot;:utf8&quot;;

warn(&quot;警告&quot;);
die(&quot;すっごい致命的なんです&quot;);
&lt;/pre&gt;binmode STDERR, &quot;:utf8&quot;;&lt;br /&gt;
標準エラーを追加しました。&lt;br /&gt;
&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;警告 at t.pl line 8.
すっごい致命的なんです at t.pl line 9.
&lt;/pre&gt;&lt;br /&gt;
いい感じですね。&lt;br /&gt;
まとめです。&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbal9Qu2r-nyIE4396wnsn4oXrPeFsRPlK6F7kiqugCilqy4g66sMyFA6_M7mg8r_8gAKT2IstR25Ao7MbCsCwOdCWkxdm9CUivtX3Qlg4rOmh5yEb74pyvlSSoYKlgQgCLJcOlQMJwzIB/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-08-17+3.23.04.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbal9Qu2r-nyIE4396wnsn4oXrPeFsRPlK6F7kiqugCilqy4g66sMyFA6_M7mg8r_8gAKT2IstR25Ao7MbCsCwOdCWkxdm9CUivtX3Qlg4rOmh5yEb74pyvlSSoYKlgQgCLJcOlQMJwzIB/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-08-17+3.23.04.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
さて、他に考えられるI/Oは…&lt;br /&gt;
標準入力を考えてみましょう&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;se strict;
use warnings;
use feature &#39;say&#39;;
use utf8;
binmode STDOUT, &quot;:utf8&quot;;
binmode STDERR, &quot;:utf8&quot;;

chomp(my $input = &lt;stdin&gt;);
say $input;
&lt;/pre&gt;&lt;br /&gt;
&quot;あいうえお&quot;って入力すると・・・&lt;br /&gt;
&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;あいうえお
ãã
&lt;/pre&gt;&lt;br /&gt;
文字化けを起こしました。&lt;br /&gt;
何が起きているか確認してみましょう。&lt;br /&gt;
&lt;br /&gt;
現時点で、外からやってきた文字列は内部の文字列表現になっていません。&lt;br /&gt;
それにもかかわらず、binmode STDOUT, &quot;:utf8&quot;;があるため&lt;br /&gt;
文字列の出力の際に、内部表現だという前提で変換しているため、&lt;br /&gt;
おかしなことになったわけです。&lt;br /&gt;
&lt;br /&gt;
もうすでに対策は薄々気づけそうですが&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use feature &#39;say&#39;;
use utf8;
binmode STDIN,  &quot;:utf8&quot;;
binmode STDOUT, &quot;:utf8&quot;;
binmode STDERR, &quot;:utf8&quot;;

chomp(my $input = &lt;stdin&gt;);
say $input;
&lt;/pre&gt;binmode STDIN,  &quot;:utf8&quot;;  &lt;br /&gt;
を追加しました&lt;br /&gt;
&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;あいうえお
あいうえお
&lt;/pre&gt;&lt;br /&gt;
理由がわかれば、簡単ですね。&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZMUTNxNHQ7FZ5Xvc3RzaIK_FLJS-WvWKMBrPZN8KxHdFow9aojFHfMgXwgut2tDqZb-ZS4fXRsWHVliPuOClo17suidktqCepfYQjrZe5WdZ4uPkcIXjmIR2bQKul-JXqlZOKPeCsFKZg/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-08-17+3.35.56.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZMUTNxNHQ7FZ5Xvc3RzaIK_FLJS-WvWKMBrPZN8KxHdFow9aojFHfMgXwgut2tDqZb-ZS4fXRsWHVliPuOClo17suidktqCepfYQjrZe5WdZ4uPkcIXjmIR2bQKul-JXqlZOKPeCsFKZg/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-08-17+3.35.56.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
今度はファイルからのよみこみ書き込みを行ってみます。&lt;br /&gt;
まずは読み込み&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use feature &#39;say&#39;;
use utf8;
binmode STDIN,  &quot;:utf8&quot;;
binmode STDOUT, &quot;:utf8&quot;;
binmode STDERR, &quot;:utf8&quot;;

open my $fh, &#39;&lt;&#39;, &#39;string.txt&#39; or die &quot;$!&quot;;
say &lt;$fh&gt;;
close $fh;
&lt;/pre&gt;&lt;br /&gt;
尚、string.txt には　あいうえお　と記載されているだけです。&lt;br /&gt;
１行取得して出力した結果は以下の通りです。&lt;br /&gt;
&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;ãã

&lt;/pre&gt;&lt;br /&gt;
また文字化けです。&lt;br /&gt;
当然ながら、perlに渡す前に内部表現に変換していないからです。&lt;br /&gt;
対応してみます。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use feature &#39;say&#39;;
use utf8;
binmode STDIN,  &quot;:utf8&quot;;
binmode STDOUT, &quot;:utf8&quot;;
binmode STDERR, &quot;:utf8&quot;;

open my $fh, &#39;&lt;:encoding(utf8)&#39;, &#39;string.txt&#39; or die &quot;$!&quot;;
say &lt;$fh&gt;;
close $fh;
&lt;/pre&gt;&lt;br /&gt;
&#39;&lt;&#39; から &#39;&lt;:encoding(utf8)&#39; へ変更しています。 
string.txt はutf8で保存されています。

実行結果：
&lt;pre class=&quot;brush: text&quot;&gt;&lt;br /&gt;
あいうえお&lt;br /&gt;
&lt;br /&gt;
&lt;/pre&gt;うまくいきました。&lt;br /&gt;
ファイルで書き込みを行う時も同じ操作になります。&lt;br /&gt;
&#39;&gt;:encoding(utf8)&#39; と言った感じです。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqWfaWAMNgiuX4E1X6FG0XOC2T8X9oOhyphenhyphen8-K3vRxQ_4qme_zQ_ScpkXxuBjY8AUVU_WWfnum_PG_08l7kqZsC_yHtG6_fEgSvC0RAau_OyWrHozuetp1CG2EZksHaKC3fkDvJp7jWuLi3V/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-08-17+3.49.14.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqWfaWAMNgiuX4E1X6FG0XOC2T8X9oOhyphenhyphen8-K3vRxQ_4qme_zQ_ScpkXxuBjY8AUVU_WWfnum_PG_08l7kqZsC_yHtG6_fEgSvC0RAau_OyWrHozuetp1CG2EZksHaKC3fkDvJp7jWuLi3V/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-08-17+3.49.14.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
残すは、他のソースコードとのやり取りですね。&lt;br /&gt;
つまり、他のモジュールへ文字列を渡したり受け取ったりする時です。&lt;br /&gt;
これは、モジュールごとに内部表現で渡すべきか、そうじゃないかは対応がまちまちなので&lt;br /&gt;
実際に試してみない限りなんとも言えません。&lt;br /&gt;
ケースバイケースで対応しましょ。&lt;br /&gt;
内部表現にしたい時は、use Encode; を使い decode_utf8(&#39;文字列&#39;)&lt;br /&gt;
内部表現からもとに戻す時は、use Enocde;を使いencode_utf8(&#39;文字列&#39;)&lt;br /&gt;
とすればよいです。&lt;br /&gt;
&lt;br /&gt;
なお、encode_utf8 はenocde(&#39;utf8&#39;, &#39;文字列&#39;) 別の書き方です。&lt;br /&gt;
違うエンコードの時は、encode(&#39;文字コード&#39;, &#39;文字列&#39;)&lt;br /&gt;
decode(&#39;文字コード&#39;, &#39;文字列&#39;)としてください。&lt;br /&gt;
&lt;br /&gt;
最後のまとめです。&lt;br /&gt;
INとOUTで分けておきました。&lt;br /&gt;
これさえ注意すればなんとかなりますね。&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8ZukvNusVqj5RcwIWyzCfKEaE3dOa0QBDRw1GWL7B-R0u99u5vRp8BU2iKLZQZOKViQSTOoXUXqsmysIrEYbZg-lHTgWYt6G3GwveXhWIARxqmKFysLH66dT3tJ2wbjKbCfxChAaCZu0w/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-08-17+11.42.12.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8ZukvNusVqj5RcwIWyzCfKEaE3dOa0QBDRw1GWL7B-R0u99u5vRp8BU2iKLZQZOKViQSTOoXUXqsmysIrEYbZg-lHTgWYt6G3GwveXhWIARxqmKFysLH66dT3tJ2wbjKbCfxChAaCZu0w/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-08-17+11.42.12.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
基本的な考えとして、use utf8は必ずつける。&lt;br /&gt;
外から受け取る時は内部表現に変更する&lt;br /&gt;
外へ出す時は、内部表現をやめる&lt;br /&gt;
モジュール間でやりとりするときは、そのまま(内部表現)でやりとりする&lt;br /&gt;
という感じでよいのではないでしょうか？</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/4573363754791661633/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2013/08/blog-post_17.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/4573363754791661633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/4573363754791661633'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2013/08/blog-post_17.html' title='マルチバイと文字列の文字列操作のお話'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg50FuDE-MOlGi-ZmH3ETQR7WyXgE6jasLc6pRyYmWP9lHOqVtXFRiM0oF9fJw6Nbr06QMapp-5bj3xlvwGSZIVwezxqDAqBU7YgVr8an11_nrE4M_Rtaxiouoq9u7VrhMKMs8U1YnihtxG/s72-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-08-17+3.12.45.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-5849579851564969877</id><published>2013-08-16T14:29:00.000+09:00</published><updated>2013-08-16T14:31:01.420+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="do"/><title type='text'>リファレンス+do</title><content type='html'>ただ読み込むだけのもっとも簡単な設定ファイルの仕組みが欲しいのであれば&lt;br /&gt;
ファイルに直接リファレンスを書き込みそれをdoしてperlとして解釈するのが一番簡単。&lt;br /&gt;
&lt;br /&gt;
まずは設定ファイルを作成する&lt;br /&gt;
ファイル名：config&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;database = &#39;fizz&#39;
user     = &#39;bazz&#39;
pass     = &#39;fizzbazz&#39;
&lt;/pre&gt;&lt;br /&gt;
ファイル名：Sample.pl&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use utf8;  
use feature &#39;say&#39;;
binmode STDOUT, &quot;:utf8&quot;;
use Dumpvalue; my $d = Dumpvalue-&gt;new();

my $configFile = &#39;config&#39;;
my $config = do $configFile or die &quot;$!&quot;;

say $config-&gt;{database};
say $config-&gt;{user};
say $config-&gt;{pass};

$d-&gt;dumpValue($config);
&lt;/pre&gt;&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;fizz
bazz
fizzbazz
&#39;database&#39; =&gt; &#39;fizz&#39;
&#39;pass&#39; =&gt; &#39;fizzbazz&#39;
&#39;user&#39; =&gt; &#39;bazz&#39;
&lt;/pre&gt;&lt;br /&gt;
個人でさくっと読み込みのみの気軽な物が・・・&lt;br /&gt;
となるとこれが一番ですかね。</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/5849579851564969877/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2013/08/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/5849579851564969877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/5849579851564969877'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2013/08/blog-post.html' title='リファレンス+do'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-9039327140941010437</id><published>2013-08-16T13:34:00.000+09:00</published><updated>2013-08-16T13:46:08.326+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Config-Simple"/><category scheme="http://www.blogger.com/atom/ns#" term="cpan"/><title type='text'>Config::Simple</title><content type='html'>■簡単な設定ファイルを操作するモジュール&lt;br /&gt;
&lt;br /&gt;
まずは設定ファイルを作成する&lt;br /&gt;
ファイル名：config&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;database = &#39;fizz&#39;
user     = &#39;bazz&#39;
pass     = &#39;fizzbazz&#39;
&lt;/pre&gt;&lt;br /&gt;
ファイル名：Sample.pl&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use utf8;
use feature &#39;say&#39;;
use Config::Simple;
binmode STDOUT, &quot;:utf8&quot;;

my $config = Config::Simple-&gt;new(&#39;./config&#39;);
say $config-&gt;param(&#39;database&#39;);
say $config-&gt;param(&#39;user&#39;);
say $config-&gt;param(&#39;pass&#39;); 
&lt;/pre&gt;&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;fizz
bazz
fizzbazz
&lt;/pre&gt;&lt;br /&gt;
new する時に、ファイルパスを指定し、その後paramメソッドで値を取得することができるようです&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ちょっとした物を記録しておき使うのであればこんな感じでよさそうですね。&lt;br /&gt;
ただ、同一のキー名を使用したい場合はセクションで区切ることで使い分けができます。&lt;br /&gt;
ファイル名：config&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;[001]
database = &#39;db001&#39;
user     = &#39;user001&#39;
pass     = &#39;pass001&#39;

[002]
database = &#39;db002&#39;
user     = &#39;user002&#39;
pass     = &#39;pass002&#39;
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use utf8;
use feature &#39;say&#39;;
use Config::Simple;
binmode STDOUT, &quot;:utf8&quot;;

my $config = Config::Simple-&gt;new(&#39;./config&#39;);

say $config-&gt;param(&quot;001.database&quot;);
say $config-&gt;param(&quot;002.database&quot;);
&lt;/pre&gt;&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;db001
db002
&lt;/pre&gt;&lt;br /&gt;
今度は、paramメソッドで[セクション名].[キー名]を指定することで値にアクセスできます。&lt;br /&gt;
&lt;br /&gt;
ちなみに、ハッシュ化することも可能で&lt;br /&gt;
オブジェクト-&gt;vars();　とすればできます。&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;use strict;
use warnings;
use utf8;  
use feature &#39;say&#39;;
use Config::Simple;
binmode STDOUT, &quot;:utf8&quot;;
use Dumpvalue; my $d = Dumpvalue-&gt;new();

my $config = Config::Simple-&gt;new(&#39;./config01&#39;);
my $hash   = $config-&gt;vars();
$d-&gt;dumpValue($hash);

say $hash-&gt;{&#39;001.user&#39;};                                                           
say $hash-&gt;{&#39;002.user&#39;};
&lt;/pre&gt;&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;&#39;001.database&#39; =&gt; &#39;db001&#39;
&#39;001.pass&#39; =&gt; &#39;pass001&#39;
&#39;001.user&#39; =&gt; &#39;user001&#39;
&#39;002.database&#39; =&gt; &#39;db002&#39;
&#39;002.pass&#39; =&gt; &#39;pass002&#39;
&#39;002.user&#39; =&gt; &#39;user002&#39;
user001
user002
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
param関数とかじゃなくて、一発でハッシュに放り込んでくれると便利そうですね。&lt;br /&gt;
ということで他のConfig系のモジュールも探してみよう。</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/9039327140941010437/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2013/08/configsimple.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/9039327140941010437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/9039327140941010437'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2013/08/configsimple.html' title='Config::Simple'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-2445471908123005544</id><published>2013-08-14T23:22:00.001+09:00</published><updated>2013-08-15T00:02:15.080+09:00</updated><title type='text'>perlの変更点が知りたい時</title><content type='html'>perldoc.jpに翻訳されたものがあるのでそちらを見るとよいと思います。&lt;br /&gt;
&lt;br /&gt;
自分もあれって何のバージョンから変更されたっけ？？&lt;br /&gt;
となるので、たまに参照します。&lt;br /&gt;
ということで、おもだったとこのリンクでもはっておきます。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://perldoc.jp/docs/perl/5.18.0/perl5180delta.pod&quot;&gt;perl v5.18.0 での変更点&lt;/a&gt;&lt;br /&gt;
→5.16.0 リリースと 5.18.0 リリースの変更点&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://perldoc.jp/docs/perl/5.16.0/perl5160delta.pod&quot;&gt;perl v5.16.0 での変更点&lt;/a&gt;&lt;br /&gt;
→5.14.0 リリースと 5.16.0 リリースの変更点&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://perldoc.jp/docs/perl/5.14.0/perl5140delta.pod&quot;&gt;perl v5.14.0 での変更点&lt;/a&gt;&lt;br /&gt;
→5.12.0 リリースと 5.14.0 リリースの変更点&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://perldoc.jp/docs/perl/5.12.0/perl5120delta.pod&quot;&gt;perl v5.12.0 での変更点&lt;/a&gt;&lt;br /&gt;
→5.10.0 リリースと 5.12.0 リリースの変更点&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://perldoc.jp/docs/perl/5.12.1/perl5100delta.pod&quot;&gt;perl 5.10.0 での変更点&lt;/a&gt;&lt;br /&gt;
→5.8.8 リリースと 5.10.0 リリースとでの相異点&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ラクダ本や、リャマ本を読んでようやく、スタートラインにたち、&lt;br /&gt;
ネットから最新情報を取得してがんばろう！&lt;br /&gt;
とした矢先に　あれ？この記述なんだ？？&lt;br /&gt;
みたいなことはよくあるものですよね。&lt;br /&gt;
おまけに、ググラビリティが低くて見つかりにくいのです…&lt;br /&gt;
そんなわけで、気になったものを簡単に羅列してみます。&lt;br /&gt;
&lt;br /&gt;
■+{} 波括弧の前のプラス&lt;br /&gt;
波括弧には、&lt;br /&gt;
関数を囲うためとハッシュのリファレンスの２通り使われるため&lt;br /&gt;
perlにこれはハッシュのリファレンスのための波括弧なんですよ。&lt;br /&gt;
ってことを知らせるために、+{}としている&lt;br /&gt;
&lt;br /&gt;
■use 5.010;  or  use feature &#39;:5.10&#39;;  or use feature &#39;say&#39;&lt;br /&gt;
&lt;br /&gt;
print &quot;値¥n&quot;;&lt;br /&gt;
とした場合、いちいち改行文字なんぞくっつけていたと思いますが&lt;br /&gt;
say &quot;値&quot;;&lt;br /&gt;
say関数であれば、改行文字を自動的にくっつけてくれる便利さんなんです。&lt;br /&gt;
という話をどこかでみかけたと思います。&lt;br /&gt;
そして、say関数を使うにはどうすればよいの？&lt;br /&gt;
とあちこち眺めてみると上記の記述にでくわすわけです。&lt;br /&gt;
&lt;br /&gt;
use feature &#39;say&#39;;&lt;br /&gt;
は、5.10で追加になったsayという関数のみ使えるようにする記述の仕方&lt;br /&gt;
&lt;br /&gt;
use feature &#39;:5.10&#39;;&lt;br /&gt;
は、5.10で追加になった機能すべて使えるようにする記述&lt;br /&gt;
&lt;br /&gt;
use 5.0.10;&lt;br /&gt;
は、5.10で追加になった機能すべて使えるようにして&lt;br /&gt;
かつそれ未満のバージョンのperlで実行しようとしたらすぐにエラーとなり停止させれます。&lt;br /&gt;
&lt;br /&gt;
つまり、明示的にsayって関数だけがつかいたいだけなんですよ！！&lt;br /&gt;
他、あるかしらんしー&lt;br /&gt;
sayだけあれば幸せだしー&lt;br /&gt;
という場合は、use feature &#39;say&#39;;&lt;br /&gt;
とかけば、他の人が読んでも 他のものはつかっていないことがはっきりします。&lt;br /&gt;
&lt;br /&gt;
ただ、5.12以降を指定すると use strictしたのと同等になり&lt;br /&gt;
いちいちuse strict;　と書かなくてすむので&lt;br /&gt;
use 5.0.12; のように記述するのを好む人もいると思います。&lt;br /&gt;
&lt;br /&gt;
という感じですかね。&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/2445471908123005544/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2013/08/perl.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/2445471908123005544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/2445471908123005544'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2013/08/perl.html' title='perlの変更点が知りたい時'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-8242687602309266194</id><published>2012-09-14T01:00:00.001+09:00</published><updated>2013-09-28T01:27:36.191+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Mojolicious-Lite"/><title type='text'>その２　ルートについて</title><content type='html'>■ルートの指定&lt;br /&gt;
まずは、ヘルパースクリプトを使ってルートの確認&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/env perl                                                                                       
use Mojolicious::Lite;

# Documentation browser under &quot;/perldoc&quot;                                                                  
plugin &#39;PODRenderer&#39;;

get &#39;/&#39; =&gt; sub {
  my $self = shift;
  $self-&gt;render(&#39;index&#39;);
};

app-&gt;start;
__DATA__

@@ index.html.ep
% layout &#39;default&#39;;
% title &#39;Welcome&#39;;
Welcome to the Mojolicious real-time web framework!

@@ layouts/default.html.ep
&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;&lt;title&gt;&lt;%= title %&gt;&lt;/title&gt;&lt;/head&gt;
  &lt;body&gt;&lt;%= content %&gt;&lt;/body&gt;
&lt;/html&gt;&lt;/pre&gt;&lt;br /&gt;
該当部分は、以下のコードですね&lt;br /&gt;
get &#39;/&#39; =&gt; sub{};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1.静的パス&lt;br /&gt;
get &#39;/foo/bar/baz1&#39; =&gt; sub {shift-&gt;render(text=&gt;&#39;/foo/bar/baz1&#39;};&lt;br /&gt;
get &#39;/foo/bar/baz2&#39; =&gt; sub {shift-&gt;render(text=&gt;&#39;/foo/bar/baz2&#39;};&lt;br /&gt;
get &#39;/foo/bar/baz3&#39; =&gt; sub {shift-&gt;render(text=&gt;&#39;/foo/bar/baz3&#39;};&lt;br /&gt;
&lt;br /&gt;
http://localhost:3000/foo/bar/baz1&lt;br /&gt;
http://localhost:3000/foo/bar/baz2&lt;br /&gt;
http://localhost:3000/foo/bar/baz3&lt;br /&gt;
それぞれにアクセスしたら&lt;br /&gt;
/foo/bar/baz1&lt;br /&gt;
/foo/bar/baz2&lt;br /&gt;
/foo/bar/baz3&lt;br /&gt;
と表示されます&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2.動的パス&lt;br /&gt;
実際のところ、静的なパスより動的なパスの方が多いと思うので&lt;br /&gt;
一番最後のパスは動的に変わるとしたら…&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;get &#39;/foo/bar/:baz&#39; =&gt; sub{
  my $self = shift;
  my $baz  = $self-&gt;param(&#39;baz&#39;);
  $self-&gt;render(text =&gt; &#39;/foo/bar/&#39; . $baz);
};&lt;/pre&gt;&lt;br /&gt;
:名前　は、ドットとスラッシュ以外の全てにマッチします。&lt;br /&gt;
そして、shift-&gt;param(&#39;名前&#39;)で値を取り出せます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ただ、静的パスの例のようにbaz+数字にヒットさせたい場合&lt;br /&gt;
上記の方法では、それ以外のパターンもヒットするので困ります。&lt;br /&gt;
こういった場合、正規表現を指定することで解決できます。&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;get &#39;/foo/bar/:baz&#39; =&gt; [baz =&gt; qr/baz\d+/] =&gt; sub{                                                        
  my $self = shift;
  my $baz  = $self-&gt;param(&#39;baz&#39;); #stashにも登録されている $self-&gt;stash(&#39;baz&#39;)
  $self-&gt;render(text =&gt; &#39;/foo/bar/&#39; . $baz);
};&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
ルートの指定についてはいろいろあり紹介しきれないので&lt;br /&gt;
こちらを参照するとよいと思います。&lt;br /&gt;
&lt;a href=&quot;https://github.com/yuki-kimoto/mojolicious-guides-japanese/wiki/Mojolicious%3A%3ALite&quot;&gt;Mojolicious::Lite&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
■パラメータの取得&lt;br /&gt;
get/postどちらもparamメソッドを使えば取得できます。&lt;br /&gt;
[getの場合]&lt;br /&gt;
shift-&gt;param(&quot;Query名&quot;);&lt;br /&gt;
[postの場合]&lt;br /&gt;
shift-&gt;param(&quot;Name属性名&quot;);&lt;br /&gt;
&lt;br /&gt;
getの参考例&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;get &#39;/get&#39; =&gt; sub{
  my $self = shift;
  my $date = $self-&gt;param(&quot;date&quot;);
  $self-&gt;render_text(&quot;Date:&quot; . $date);
};&lt;/pre&gt;http://localhost:3000/get?date=20121203&lt;br /&gt;
にアクセスすると&lt;br /&gt;
Date:20121203&lt;br /&gt;
と表示されます。&lt;br /&gt;
&lt;br /&gt;
チェックボックスの値など複数の値が帰ってくる場合は&lt;br /&gt;
配列変数で受け取ればよいです。&lt;br /&gt;
また、引数を省略すると全てのパラメータ名が帰ってきます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://program-perl.blogspot.jp/2012/09/mojoliciouslite.html&quot;&gt;Mojolicious::Liteへ戻る&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/8242687602309266194/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/09/blog-post_14.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/8242687602309266194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/8242687602309266194'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/09/blog-post_14.html' title='その２　ルートについて'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-3777068146602668170</id><published>2012-09-13T22:58:00.001+09:00</published><updated>2013-10-29T22:25:22.594+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Mojolicious-Lite"/><title type='text'>Mojolicious</title><content type='html'>■メモ。&lt;br /&gt;
&lt;a href=&quot;http://program-perl.blogspot.com/2012/09/blog-post.html&quot;&gt;その１　てっとり早く動かしてみる&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://program-perl.blogspot.com/2012/09/blog-post_14.html&quot;&gt;その２　ルートについて&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;$self-&gt;app-&gt;log-&gt;debug()
$self-&gt;app-&gt;log-&gt;error()
$self-&gt;app-&gt;log-&gt;fatal()
$self-&gt;app-&gt;log-&gt;info()
$self-&gt;app-&gt;log-&gt;warn()

$self-&gt;app-&gt;render-&gt;paths

$self-&gt;helper() 

$self-&gt;req-&gt;param()

$self-&gt;res-&gt;code

$self-&gt;render() text,template
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/3777068146602668170/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/09/mojoliciouslite.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/3777068146602668170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/3777068146602668170'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/09/mojoliciouslite.html' title='Mojolicious'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-3155900093693456281</id><published>2012-09-13T22:54:00.005+09:00</published><updated>2013-09-28T01:27:09.760+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Mojolicious-Lite"/><title type='text'>その１　てっとり早く動かしてみる</title><content type='html'>雰囲気を味わうためにヘルパースクリプトを実行してみます。&lt;br /&gt;
何も考えずに実行してみます。&lt;br /&gt;
$mojo generate lite_app hello.pl&lt;br /&gt;
&lt;br /&gt;
以下のようなコードが生成されます。&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/env perl                                                                                       
use Mojolicious::Lite;

# Documentation browser under &quot;/perldoc&quot;                                                                  
plugin &#39;PODRenderer&#39;;

get &#39;/&#39; =&gt; sub {
  my $self = shift;
  $self-&gt;render(&#39;index&#39;);
};

app-&gt;start;
__DATA__

@@ index.html.ep
% layout &#39;default&#39;;
% title &#39;Welcome&#39;;
Welcome to the Mojolicious real-time web framework!

@@ layouts/default.html.ep
&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;&lt;title&gt;&lt;%= title %&gt;&lt;/title&gt;&lt;/head&gt;
  &lt;body&gt;&lt;%= content %&gt;&lt;/body&gt;
&lt;/html&gt;&lt;/pre&gt;&lt;br /&gt;
これまた、何も考えずに以下を実行します&lt;br /&gt;
$morbo hello.pl&lt;br /&gt;
&lt;br /&gt;
すると以下メッセージが表示されるので、localhostの3000ポートにアクセスしてみます。&lt;br /&gt;
[Wed Sep 12 23:45:49 2012] [info] Listening at &quot;http://*:3000&quot;.&lt;br /&gt;
Server available at http://127.0.0.1:3000.&lt;br /&gt;
&lt;br /&gt;
Welcome to the Mojolicious real-time web framework!&lt;br /&gt;
と表示されました。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ここまでの補足。&lt;br /&gt;
・ヘルパーコマンドについて&lt;br /&gt;
$mojo generate help&lt;br /&gt;
でmojo generateのコマンドの簡単な説明が表示されます&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------&lt;br /&gt;
These generators are currently available:&lt;br /&gt;
app        Generate Mojolicious application directory structure.&lt;br /&gt;
lite_app   Generate Mojolicious::Lite application.&lt;br /&gt;
makefile   Generate &quot;Makefile.PL&quot;.&lt;br /&gt;
plugin     Generate Mojolicious plugin directory structure.&lt;br /&gt;
---------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Mojolicious::Liteのひな形を作りたかったので&lt;br /&gt;
$mojo generate lite_app アプリ名　としたわけですね。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
・開発用webサーバ&lt;br /&gt;
$morbo アプリ名&lt;br /&gt;
で、開発用webサーバが起動します。&lt;br /&gt;
ファイルを書きなおしても再度立ち上げ直す必要はありません。&lt;br /&gt;
Ctrl + cで終了。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
・use Mojolicious::Lite &lt;br /&gt;
use strict; use warings;が有効になる&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
・plugin &#39;PODRenderer&#39;&lt;br /&gt;
ヘルパーコマンドのソースには、Mojoliciousのガイドページが閲覧できるようになっています。&lt;br /&gt;
http://localhost:3000/perldoc　で見れます。&lt;br /&gt;
&lt;br /&gt;
ひとまずここまで。&lt;br /&gt;
ルート、ビューについては後日メモ。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://program-perl.blogspot.jp/2012/09/mojoliciouslite.html&quot;&gt;Mojolicious::Liteへ戻る&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/3155900093693456281/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/09/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/3155900093693456281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/3155900093693456281'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/09/blog-post.html' title='その１　てっとり早く動かしてみる'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-5159368466996652279</id><published>2012-04-09T01:49:00.002+09:00</published><updated>2012-04-09T01:54:39.762+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="リファレンス"/><title type='text'>リファレンスのメモ</title><content type='html'>変数の前に\をつけることでその変数に対する参照(リファレンス)でやり取りが可能になる。&lt;br /&gt;
そして、参照情報から実際の値を取り出すには、各変数のファニー文字(スカラー⇒$,&lt;br /&gt;
配列⇒@, ハッシュ⇒%)をつけてあげれば元の変数のように扱うことができる。&lt;br /&gt;
&lt;br /&gt;
サンプルコード&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl                                                                         
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use File::Find;

binmode STDIN,  &quot;:utf8&quot;;
binmode STDOUT, &quot;:utf8&quot;;

#配列、ハッシュ                                                                         
my @array = (&quot;a&quot;, &quot;b&quot;, &quot;c&quot;);
my %hash  = (
             guu   =&amp;gt; &quot;rock&quot;,
             cyoki =&amp;gt; &quot;scissors&quot;,
             paa   =&amp;gt; &quot;paper&quot;,
            );

#リファレンス                                                                           
my $ref_array = \@array;
my $ref_hash  = \%hash;

                                                                                   
#表示                                                                                   
for(my $i = 0; $i &amp;lt; @{$ref_array}; $i++){
  say &quot;${$ref_array}[$i]&quot;;
}


for my $key (keys %{$ref_hash}){ 
  say &quot;key: $key / value: ${$ref_hash}{$key}&quot;;
}
&lt;/pre&gt;実行結果： &lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;a
b
c
key: paa / value: paper
key: cyoki / value: scissors
key: guu / value: rock
&lt;/pre&gt;変数の頭に\をつけることをリファレンスと呼びその逆の行為をデリファレンスと呼ぶ。&lt;br /&gt;
デリファレンスした後&lt;br /&gt;
 配列の場合　${$ref_array}[$i]&lt;br /&gt;
ハッシュの場合 ${$ref_hash}{$key}&lt;br /&gt;
とアクセスすることもできるが、アロー演算子による表記が用意されているので&lt;br /&gt;
以下のように書き換えることができる。&lt;br /&gt;
&lt;br /&gt;
配列の場合 　　$ref_array-&amp;gt;[$i]&lt;br /&gt;
ハッシュの場合 $ref_hash-&amp;gt;{$key} &lt;br /&gt;
サブルーチンの場合も同様にアロー演算子による表記が可能である。&lt;br /&gt;
まとめ。&lt;br /&gt;
 配列　　　リファレンス-&amp;gt;[要素]&lt;br /&gt;
ハッシュ　リファレンス-&amp;gt;{キー}&lt;br /&gt;
関数　　　リファレンス-&amp;gt;(引数) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
上記の例では、配列とハッシュの変数に格納してからリファレンスを&lt;br /&gt;
扱っているが直接リファレンスを扱うこともできる。&lt;br /&gt;
&lt;br /&gt;
配列の場合&lt;br /&gt;
(要素, 要素, 要素)から&lt;br /&gt;
[要素, 要素, 要素]に変えるだけ。 &lt;br /&gt;
&lt;br /&gt;
ハッシュの場合&lt;br /&gt;
(キー=&amp;gt;値, キー=&amp;gt;値)から&lt;br /&gt;
{キー=&amp;gt;値, キー=&amp;gt;値}に変えるだけ。&lt;br /&gt;
&lt;br /&gt;
上記の例を書き直すとこうなる。 &lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl                                                                         
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use File::Find;

binmode STDIN,  &quot;:utf8&quot;;
binmode STDOUT, &quot;:utf8&quot;;


#リファレンス                                                                           
my $ref_array = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;];
my $ref_hash  = {
                 guu   =&amp;gt; &quot;rock&quot;,
                 cyoki =&amp;gt; &quot;scissors&quot;,
                 paa   =&amp;gt; &quot;paper&quot;,
                };

                                                                                   
#表示                                                                                   
for(my $i = 0; $i &amp;lt; @{$ref_array}; $i++){
  say &quot;${$ref_array}[$i]&quot;;
}


for my $key (keys %{$ref_hash}){ 
  say &quot;key: $key / value: ${$ref_hash}{$key}&quot;;
}
&lt;/pre&gt;簡単ですね！    さて、今度は多次元配列を表現してみます。 &lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl                                                                         
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use File::Find;

binmode STDIN,  &quot;:utf8&quot;;
binmode STDOUT, &quot;:utf8&quot;;


#リファレンス
my $ref_array = [
                 [1, 2],
                 [3, 4, 5],
                 [6, 7, 8, 9, 0],
                ];


for (my $x = 0; $x &amp;lt; @{$ref_array}; $x++){
  for (my $y = 0; $y &amp;lt; @{$ref_array-&amp;gt;[$x]}; $y++){
    say $ref_array-&amp;gt;[$x][$y];
  }
}
&lt;/pre&gt;&lt;br /&gt;
@{$ref_array} で [1, 2]と[3, 4, 5]と[6, 7, 8, 9, 0]の3要素であることを取得し&lt;br /&gt;
@{$ref_array-&amp;gt;[$x]}で各要素 &lt;br /&gt;
[1, 2] =&amp;gt; 2要素&lt;br /&gt;
[3, 4, 5] =&amp;gt; 3要素&lt;br /&gt;
[6, 7, 8,  9, 0] =&amp;gt; 4要素&lt;br /&gt;
であることを取得しています。</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/5159368466996652279/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/04/blog-post_09.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/5159368466996652279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/5159368466996652279'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/04/blog-post_09.html' title='リファレンスのメモ'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-3145635663593563433</id><published>2012-04-08T22:23:00.003+09:00</published><updated>2012-04-08T22:23:48.855+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cpan"/><category scheme="http://www.blogger.com/atom/ns#" term="File-FInd"/><title type='text'>File::Find</title><content type='html'>■再帰的にディレクトリを移動して、ファイル/ディレクトリ名を取得する&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;.
├── 1
│   └── 2
│       └── 3.txt
├── a
│   └── b.txt
└── Sample.pl
&lt;/pre&gt;&lt;br /&gt;
上記構成を例に使用してみる。&lt;br /&gt;
■&quot;1&quot;ディレクトリの構成を調べる&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use File::Find;


find(\&amp;wanted, &#39;1&#39;);                                                                    

sub wanted{
  say &quot;CurrentDirectory :&quot;, $File::Find::dir;
  say &quot;Name             :&quot;, $_;
  say &quot;FullPath         :&quot;, $File::Find::name;
  say &quot;---&quot;;
}
&lt;/pre&gt;&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;CurrentDirectory :1
Name             :.
FullPath         :1
---
CurrentDirectory :1
Name             :2
FullPath         :1/2
---
CurrentDirectory :1/2
Name             :3.txt
FullPath         :1/2/3.txt
---
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
■複数のディレクトリを指定してみる&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use File::Find;


find(\&amp;wanted, qw/1 a/); #配列で指定

sub wanted{
  say &quot;CurrentDirectory :&quot;, $File::Find::dir;
  say &quot;Name             :&quot;, $_;
  say &quot;FullPath         :&quot;, $File::Find::name;
  say &quot;---&quot;;
}
&lt;/pre&gt;&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;CurrentDirectory :1
Name             :.
FullPath         :1
---
CurrentDirectory :1
Name             :2
FullPath         :1/2
---
CurrentDirectory :1/2
Name             :3.txt
FullPath         :1/2/3.txt
---
CurrentDirectory :a
Name             :.
FullPath         :a
---
CurrentDirectory :a
Name             :b.txt
FullPath         :a/b.txt
---
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
■一番下の階層からスタートする&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use File::Find;


finddepth(\&amp;wanted, &#39;1&#39;);

sub wanted{
  say &quot;CurrentDirectory :&quot;, $File::Find::dir;
  say &quot;Name             :&quot;, $_;
  say &quot;FullPath         :&quot;, $File::Find::name;
  say &quot;---&quot;;
}
&lt;/pre&gt;&lt;br /&gt;
実行結果：&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;CurrentDirectory :1/2
Name             :3.txt
FullPath         :1/2/3.txt
---
CurrentDirectory :1
Name             :2
FullPath         :1/2
---
CurrentDirectory :1
Name             :.
FullPath         :1
---
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/3145635663593563433/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/04/blog-post_9664.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/3145635663593563433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/3145635663593563433'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/04/blog-post_9664.html' title='File::Find'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-8830702712939680019</id><published>2012-04-08T21:28:00.001+09:00</published><updated>2012-04-08T21:28:22.586+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cpan"/><category scheme="http://www.blogger.com/atom/ns#" term="FindBin"/><title type='text'>FindBin</title><content type='html'>実行スクリプトのディレクトリを取得するモジュール&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use FindBin;
                                                        
say $FindBin::Bin;&lt;/pre&gt;&lt;br /&gt;
libモジュールのパス指定をする際に利用すると便利。&lt;br /&gt;
use lib &quot;$FindBin::Bin/lib&quot;;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/8830702712939680019/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/04/findbin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/8830702712939680019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/8830702712939680019'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/04/findbin.html' title='FindBin'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-1088986043797333752</id><published>2012-04-08T19:35:00.000+09:00</published><updated>2012-04-08T19:35:37.352+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cpan"/><category scheme="http://www.blogger.com/atom/ns#" term="File-Path"/><title type='text'>File::Path</title><content type='html'>■ディレクトリの作成&lt;br /&gt;
カレントディレクトリにfoo/bar/bazなディレクトリ階層を作成したい時&lt;br /&gt;
&lt;br /&gt;
下記構成&lt;br /&gt;
├── foo&lt;br /&gt;
│   └── bar&lt;br /&gt;
│       └── baz&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use strict;
use warnings;
use utf8;

mkdir foo
mkdir foo/bar
mkdir foo/bar/baz&lt;/pre&gt;のように上位ディレクトリから順に作成していくことになる。&lt;br /&gt;
&lt;br /&gt;
File::Pathを使うと１行ですむ。&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use File::Path qw/make_path/;

make_path(&#39;foo/bar/baz&#39;); #ver 2.06以降&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
■ディレクトリの削除&lt;br /&gt;
下記ディレクトリ構造でfooディレクトリを削除したい時&lt;br /&gt;
├── foo&lt;br /&gt;
│   ├── bar&lt;br /&gt;
│   │   ├── baz&lt;br /&gt;
│   │   │   └── sample.txt&lt;br /&gt;
│   │   └── sample.txt&lt;br /&gt;
│   └── sample.txt&lt;br /&gt;
最下層のディレクトリ内のファイルを削除⇒ディレクトリ削除の順で削除する必要がある。&lt;br /&gt;
File::Findeモジュールのfinddepth関数で最下層のディレクトリからアクセスして削除していく&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use File::Find;
use FindBin;

finddepth(\&amp;deleteAll, &#39;foo&#39;);

sub deleteAll{
  #フルパスじゃないと削除できなかったのでスクリプトのパスを取得しておく
  my $BasePath = $FindBin::Bin . &#39;/&#39;;
  if(-f $_){ unlink $BasePath . $File::Find::name || die $! };
  if(-d $_){ rmdir  $BasePath . $File::Find::name || die $! };                          
}&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
File::Pathを使うと１行ですむ。&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use File::Path qw/remove_tree/;

remove_tree(&#39;foo&#39;); #ver 2.06以降&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
v2.00より前とv2.06より前とそれ以降でインターフェースが異なります。&lt;br /&gt;
perl -MFile::Path -le &#39;print &quot;$File::Path::VERSION&quot;&#39;&lt;br /&gt;
等で、確認した上で利用する必要があります。&lt;br /&gt;
&lt;br /&gt;
v2.06以降の場合&lt;br /&gt;
&lt;pre class=&quot;brush:pl&quot;&gt;use File::Path qw(make_path remove_tree);

  make_path(&#39;foo/bar/baz&#39;, &#39;/zug/zwang&#39;); #複数作成したい場合コンマで区切る
  make_path(&#39;foo/bar/baz&#39;, &#39;/zug/zwang&#39;, {
      verbose =&gt; 1,  #1を指定すると実行時コマンドを出力する
      mode =&gt; 0711, #アクセス権限を指定  デフォ:0777
  });

  remove_tree(&#39;foo/bar/baz&#39;, &#39;/zug/zwang&#39;);
  remove_tree(&#39;foo/bar/baz&#39;, &#39;/zug/zwang&#39;, {
      verbose =&gt; 1,
      error  =&gt; \my $err_list, #エラー情報
  });&lt;/pre&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/1088986043797333752/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/04/filepath.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/1088986043797333752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/1088986043797333752'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/04/filepath.html' title='File::Path'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-3105780306832504583</id><published>2012-04-08T13:01:00.001+09:00</published><updated>2012-04-08T13:01:59.931+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="OneLiner"/><title type='text'>ワンライナー</title><content type='html'>随時追加していく予定。&lt;br /&gt;
&lt;br /&gt;
・eスイッチ&lt;br /&gt;
文字列をスクリプトとして解釈する&lt;br /&gt;
---&lt;br /&gt;
perl -e &#39;print &quot;hello world¥n&quot;&#39;&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
・lスイッチ&lt;br /&gt;
行末に改行をつけてくれる。下の２コードは同じ結果となる&lt;br /&gt;
---&lt;br /&gt;
perl -e &#39;print &quot;hello world¥n&quot;&#39;&lt;br /&gt;
perl -le &#39;print &quot;hello world&quot;&#39;&lt;br /&gt;
---&lt;br /&gt;
改行を自動的につけてくれるといえばsay関数があるのでそれを使っても同じ結果となる。&lt;br /&gt;
ただし、Eスイッチになる。&lt;br /&gt;
---&lt;br /&gt;
perl -e &#39;print &quot;hello world¥n&quot;&#39;&lt;br /&gt;
perl -le &#39;print &quot;hello world&quot;&#39;&lt;br /&gt;
perl -E &#39;say &quot;hello world&quot;&#39;&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
・Mスイッチ&lt;br /&gt;
モジュールを呼び出す&lt;br /&gt;
---&lt;br /&gt;
#FilePathモジュールのバージョンを出力&lt;br /&gt;
perl -MFile::Path -E &#39;say &quot;$File::Path::VERSION&quot;&#39;&lt;br /&gt;
#LWP::Simpleをつかってwww.google.co.jpを取得&lt;br /&gt;
perl -MLWP::Simple -E &#39;say get shift&#39; http://google.co.jp&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/3105780306832504583/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/04/blog-post_08.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/3105780306832504583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/3105780306832504583'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/04/blog-post_08.html' title='ワンライナー'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-4782263080985038025</id><published>2012-04-08T12:22:00.003+09:00</published><updated>2012-04-10T00:38:12.531+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hash"/><title type='text'>配列からハッシュを作る</title><content type='html'>■ハッシュ&lt;br /&gt;
・２つの配列(キー用の配列,値用の配列)からハッシュを作る&lt;br /&gt;
⇒ハッシュのスライスを使う&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use Encode;

my @k = qw/k1 k2 k3/;
my @v = qw/v1 v2 v3/;
my %h = ();
@h{@k} = @v; #ハッシュのスライス

for my $key (sort keys %h){
  say encode_utf8(&quot;key:&quot;. $key. &quot; value:&quot;. $h{$key});
}&lt;/pre&gt;実行結果&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;key:k1 value:v1
key:k2 value:v2
key:k3 value:v3&lt;/pre&gt;&lt;br /&gt;
上記では、空のハッシュに対し、ハッシュのスライスをおこなってみた。&lt;br /&gt;
今度は、値が入っているハッシュに対し、ハッシュのスライスを行い&lt;br /&gt;
配列データを配列に格納してみる。&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use Encode;

my @k = qw/k1 k2 k3/;
my @v = qw/v1 v2 v3/;
my %h = (&quot;k0&quot; =&gt; &quot;v0&quot;, &quot;k1&quot; =&gt; &quot;dummy&quot;);
@h{@k} = @v; #ハッシュのスライス

for my $key (sort keys %h){
  say encode_utf8(&quot;key:&quot;. $key. &quot; value:&quot;. $h{$key});
}&lt;/pre&gt;&lt;br /&gt;
実行結果&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;key:k0 value:v0
key:k1 value:v1
key:k2 value:v2
key:k3 value:v3&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
・配列(一つ)からハッシュを作る。&lt;br /&gt;
(存在するかどうかを知るためにハッシュ化するだけで値は意味のある値を必要としないとする)&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use Encode;

my @k = qw/k1 k2 k3/;
my %h = ();
@h{@k} = 1..@k; #ハッシュのスライス

for my $key (sort keys %h){
  say encode_utf8(&quot;key:&quot;. $key. &quot; value:&quot;. $h{$key});
}&lt;/pre&gt;&lt;br /&gt;
実行結果&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;key:k1 value:1
key:k2 value:2
key:k3 value:3&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
でも…map関数を使えばもっと綺麗に。&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use Encode;

my @k = qw/k1 k2 k3/;
my %h = map{($_, 1)} @k;

for my $key (sort keys %h){
  say encode_utf8(&quot;key:&quot;. $key. &quot; value:&quot;. $h{$key});
}&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/4782263080985038025/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/04/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/4782263080985038025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/4782263080985038025'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/04/blog-post.html' title='配列からハッシュを作る'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-2161163222956523727</id><published>2012-03-11T22:21:00.001+09:00</published><updated>2012-03-11T22:23:18.506+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cpan"/><category scheme="http://www.blogger.com/atom/ns#" term="WebService-YahooJapan-WebMA"/><title type='text'>WebService::YahooJapan::WebMA</title><content type='html'>■Yahoo! 形態素解析APIを使ってみるメモ。&lt;br /&gt;
形態素解析APIを利用するにあたり、Yahooのアカウントと&lt;br /&gt;
AppIDを取得する必要があるので先に済ませておく。&lt;br /&gt;
&lt;br /&gt;
1.Yahoo!のアカウントを取る。&lt;br /&gt;
&lt;a href=&quot;https://login.yahoo.co.jp/config/login&quot;&gt;https://login.yahoo.co.jp/config/login&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2.どのページでもよいが、アプリケーションIDの登録をすませておく。&lt;br /&gt;
&lt;a href=&quot;http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html&quot;&gt;http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use feature &#39;say&#39;;
use strict;
use warnings;
use WebService::YahooJapan::WebMA;
use utf8;
use Dumpvalue; my $d = Dumpvalue-&gt;new();
binmode STDOUT, &quot;:utf8&quot;;

my $AppID = &#39;上記で取得しておいたアプリケーションIDを記載する&#39;;
$WebService::YahooJapan::WebMA::APIBase = 
         &#39;http://jlp.yahooapis.jp/MAService/V1/parse&#39;;

my $api    = WebService::YahooJapan::WebMA-&gt;new( appid =&gt; $ApiID);
my $result = $api-&gt;parse(sentence =&gt; &#39;本日は晴天なり&#39;) or die $api-&gt;error; #解析したい文章を指定する

$d-&gt;dumpValue($result);&lt;/pre&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;&#39;ma_result&#39; =&gt; HASH(0x7fa5bbb28ec8)
   &#39;filtered_count&#39; =&gt; 4
   &#39;total_count&#39; =&gt; 4
   &#39;word_list&#39; =&gt; ARRAY(0x7fa5bbb1ee98)
      0  HASH(0x7fa5bbb25838)
         &#39;pos&#39; =&gt; &#39;名詞&#39;
         &#39;reading&#39; =&gt; &#39;ほんじつ&#39;
         &#39;surface&#39; =&gt; &#39;本日&#39;
      1  HASH(0x7fa5bbb25880)
         &#39;pos&#39; =&gt; &#39;助詞&#39;
         &#39;reading&#39; =&gt; &#39;は&#39;
         &#39;surface&#39; =&gt; &#39;は&#39;
      2  HASH(0x7fa5bbb25670)
         &#39;pos&#39; =&gt; &#39;名詞&#39;
         &#39;reading&#39; =&gt; &#39;せいてん&#39;
         &#39;surface&#39; =&gt; &#39;晴天&#39;
      3  HASH(0x7fa5bbb24718)
         &#39;pos&#39; =&gt; &#39;助動詞&#39;
         &#39;reading&#39; =&gt; &#39;なり&#39;
         &#39;surface&#39; =&gt; &#39;なり&#39;
&#39;xmlns&#39; =&gt; &#39;urn:yahoo:jp:jlp&#39;
&#39;xmlns:xsi&#39; =&gt; &#39;http://www.w3.org/2001/XMLSchema-instance&#39;
&#39;xsi:schemaLocation&#39; =&gt; &#39;urn:yahoo:jp:jlp http://jlp.yahooapis.jp/MAService/V1/parseResponse.xsd&#39;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/2161163222956523727/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/03/webserviceyahoojapanwebma.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/2161163222956523727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/2161163222956523727'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/03/webserviceyahoojapanwebma.html' title='WebService::YahooJapan::WebMA'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-5666267732388762092</id><published>2012-03-04T22:01:00.003+09:00</published><updated>2012-04-09T00:43:28.311+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="特殊変数"/><title type='text'>perlの特殊変数のめも</title><content type='html'>&lt;span style=&quot;color: orange;&quot;&gt;&lt;b&gt;気長にメモしていく予定。&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table class=&quot;MyTable&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th style=&quot;width: 45px;&quot;&gt;変数&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;$$&lt;/td&gt;&lt;td&gt;プロセスIDを返す&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;$,&lt;/td&gt;&lt;td&gt;リストを出力時のセパレータ。デフォルトは空文字。&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;$.&lt;/td&gt;&lt;td&gt;ファイルハンドルが読み込みを行った行番号が格納されている。ファイルの内容を１行ずつ読み込んでいる際に目的の行を見つけた際にそれが何行目か知りたい時などに利用&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;$0&lt;/td&gt;&lt;td&gt;スクリプト実行時のパスを返す(絶対パスなら絶対パス。相対パスなら相対パス)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;$]&lt;/td&gt;&lt;td&gt;スクリプト実行した際のperlのバージョン&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;$|&lt;/td&gt;&lt;td&gt;０以外を指定すると出力時のバッファーを行わなくなる。デフォルトは0&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/5666267732388762092/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/03/perl.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/5666267732388762092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/5666267732388762092'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/03/perl.html' title='perlの特殊変数のめも'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-2628759652975838225</id><published>2012-03-03T22:13:00.001+09:00</published><updated>2012-03-03T22:15:12.921+09:00</updated><title type='text'>say関数</title><content type='html'>say関数を使いたい時どうすればいいのか。&lt;br /&gt;
というので、調べてみたら&lt;br /&gt;
&lt;br /&gt;
use feature &#39;say&#39;;&lt;br /&gt;
&lt;br /&gt;
だったり&lt;br /&gt;
&lt;br /&gt;
use 5.10.0;&lt;br /&gt;
&lt;br /&gt;
だったり&lt;br /&gt;
&lt;br /&gt;
use feature &#39;:5.10.0&#39;;&lt;br /&gt;
&lt;br /&gt;
だったり&lt;br /&gt;
&lt;br /&gt;
use 5.010;&lt;br /&gt;
&lt;br /&gt;
いろいろあって違いがよくわからなかった。&lt;br /&gt;
で、featureプラグマの訳があったんで非常に理解しやすかった。&lt;br /&gt;
⇒&lt;a href=&quot;http://perldoc.jp/docs/modules/feature-1.11/feature.pod&quot;&gt;http://perldoc.jp/docs/modules/feature-1.11/feature.pod&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
つまり&lt;br /&gt;
use feature　では、ピンポイントの機能追加を行い&lt;br /&gt;
use feature &#39;:5.10.0&#39;; では、追加機能が全て使えるようになる&lt;br /&gt;
use 5.10.0;　は、上の別表記。&lt;br /&gt;
use 5.010;    は、移植性の警告(?)を出さないための書き方ということなのね。&lt;br /&gt;
&lt;br /&gt;
言ってしまえば、sayだけ使いたいんよ。&lt;br /&gt;
というのであるなら、追加機能すべて使える必要はなくて&lt;br /&gt;
use feature &#39;say&#39;;&lt;br /&gt;
&lt;br /&gt;
で、OKってことになるのね。&lt;br /&gt;
で、おｋ？</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/2628759652975838225/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/03/say.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/2628759652975838225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/2628759652975838225'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/03/say.html' title='say関数'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-545945377522867285.post-4852003189732933780</id><published>2012-03-03T15:06:00.000+09:00</published><updated>2012-10-11T23:28:15.088+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cpan"/><category scheme="http://www.blogger.com/atom/ns#" term="Time-Piece"/><title type='text'>Time:Piece</title><content type='html'>■日時の取得 &lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use feature &#39;say&#39;;
use strict;
use warnings;
use utf8;
use Time::Piece;
binmode STDOUT, &quot;:utf8&quot;;


my $t = localtime;

### 日時の表示
say $t;              #Sat Mar  3 14:53:37 2012
say $t-&gt;datetime;    #2012-03-03T14:53:37
say $t-&gt;datetime(
         date =&gt; &#39;/&#39;, 
         T    =&gt; &#39; &#39;,
         time =&gt; &#39;-&#39;
                );   #2012/03/03 14-53-37
say $t-&gt;strftime(&#39;%Y*%m*%d  %H@%M@%S&#39;);
                     #2012*03*03  14@53@37  注：UTF8フラグが落ちてます


### 年月日の表示
say $t-&gt;ymd;      #2012-03-03
say $t-&gt;ymd(&quot;/&quot;); #2012/03/03
say $t-&gt;ymd(&quot;&quot;);  #20120303

say $t-&gt;year;     #2012
say $t-&gt;mon;      #3
say $t-&gt;mday;     #3


### 曜日の表示
say $t-&gt;wday;      #7
say $t-&gt;wdayname;  #Sat
say $t-&gt;wdayname(
   qw/日 月 火 水 木 金 土/
                ); #土

#wdaynameを何度も使うのなら
#デフォルトの曜日を変更してしまう
$t-&gt;day_list(qw/日 月 火 水 木 金 土/);
say $t-&gt;wdayname;  #土


### 時分秒の表示
say $t-&gt;hms;      #14:53:37
say $t-&gt;hms(&quot;-&quot;); #14-53-37
say $t-&gt;hms(&quot;&quot;);  #145337

say $t-&gt;hour;     #14
say $t-&gt;min;      #53
say $t-&gt;sec;      #37


### 他
#閏年判定
say $t-&gt;is_leap_year ? &quot;閏年&quot; : &quot;Not閏年&quot;; #閏年

#最終日
say $t-&gt;month_last_day; #31


### 任意の時間を設定
$t = localtime-&gt;strptime(&#39;2000-01-01 12:00:00&#39;, &#39;%Y-%m-%d %H:%M:%S&#39;);
say $t-&gt;datetime; #2000-01-01T12:00:00


### 時間の比較
my $BaseDate = localtime-&gt;strptime(&#39;20001122&#39;, &#39;%Y%m%d&#39;);
my $TestDate = localtime-&gt;strptime(&#39;20111122&#39;, &#39;%Y%m%d&#39;);
say $BaseDate &lt; $TestDate ? &quot;もうすぎたよ&quot; : &quot;まだ過ぎてないよ&quot;;
                  #もうすぎだよ

### 時間の加減・減算(秒単位で返ってくる)
my $date1 = localtime-&gt;strptime(&#39;20120101&#39;, &#39;%Y%m%d&#39;);
my $date2 = localtime-&gt;strptime(&#39;20130101&#39;, &#39;%Y%m%d&#39;);
my $days  = ($date2 - $date1) / (24 * 60 * 60);
say $days;        #366
&lt;/pre&gt;&lt;br /&gt;
ただ、一つ注意。&lt;br /&gt;
strftimeメソッドは、utf8フラグを落とすことに注意。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use strict;
use warnings;
use Time::Piece;
use utf8;
use Devel::Peek;

my $t = localtime;
Dump $t-&gt;wdayname(qw/日 月 火 水 木 金 土/);
Dump $t-&gt;strftime(&#39;%Y年%m月%d日&#39;);&lt;/pre&gt;&lt;br /&gt;
実行結果&lt;br /&gt;
&lt;pre class=&quot;brush: text&quot;&gt;SV = PV(0x7fd56b801170) at 0x7fd56b842708
  REFCNT = 1
  FLAGS = (TEMP,POK,pPOK,UTF8)
  PV = 0x105d08220 &quot;\346\227\245&quot;\0 [UTF8 &quot;\x{65e5}&quot;]
  CUR = 3
  LEN = 16
SV = PV(0x7fd56b801190) at 0x7fd56b842708
  REFCNT = 1
  FLAGS = (TEMP,POK,pPOK)
  PV = 0x105d06df0 &quot;2012\345\271\26403\346\234\21004\346\227\245&quot;\0
  CUR = 17
  LEN = 32
&lt;/pre&gt;&lt;br /&gt;
wdaynameメソッドの方には、UTF8フラグが残っているけど&lt;br /&gt;
strftimeメソッドの方には、UTF8フラグがないですよね。&lt;br /&gt;
&lt;br /&gt;
上の例のように&lt;br /&gt;
binmode STDOUT, &quot;:utf8&quot;;&lt;br /&gt;
して、標準出力する際にフラグを落とすようにしている場合&lt;br /&gt;
文字化けしちゃいます。&lt;br /&gt;
&lt;br /&gt;
美しくないけど&lt;br /&gt;
binmode STDOUT, &quot;:utf8&quot;;　するなら&lt;br /&gt;
use Encode;&lt;br /&gt;
say decode_utf8($t-&gt;strftimeメソッド);&lt;br /&gt;
&lt;br /&gt;
のように内部にあるデータには徹底してフラグをつけるか&lt;br /&gt;
&lt;br /&gt;
binmode STDOUT, &quot;:utf8&quot;;　を使わないなら&lt;br /&gt;
use Encode;&lt;br /&gt;
say encode_utf8($t-&gt;strftime以外のメソッド);&lt;br /&gt;
say $t-&gt;strftimeメソッド;&lt;br /&gt;
&lt;br /&gt;
とするしかないのかな…。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
おまけ。&lt;br /&gt;
1日後、1ヶ月後を簡単に求めるのに&lt;br /&gt;
Time::Secondsを使う方法があります。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: pl&quot;&gt;#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use feature &#39;say&#39;;
use Time::Piece;
use Time::Seconds;

my $t = localtime;
say $t-&gt;ymd; #2012-03-03

$t += ONE_MONTH;
say $t-&gt;ymd; #2012-04-03

$t += ONE_MONTH;
say $t-&gt;ymd; #2012-05-03

$t += ONE_MONTH * 2;
say $t-&gt;ymd; #2012-07-03
&lt;/pre&gt;&lt;br /&gt;
Time::Secondsを利用すると以下の定数が使えるようになります。&lt;br /&gt;
&lt;blockquote&gt;ONE_DAY&lt;br /&gt;
ONE_WEEK&lt;br /&gt;
ONE_HOUR&lt;br /&gt;
ONE_MINUTE&lt;br /&gt;
ONE_MONTH&lt;br /&gt;
ONE_YEAR&lt;br /&gt;
ONE_FINANCIAL_MONTH&lt;br /&gt;
LEAP_YEAR&lt;br /&gt;
NON_LEAP_YEAR&lt;/blockquote&gt;&lt;br /&gt;
後は、掛け算して加減算するなりすればよいですね。</content><link rel='replies' type='application/atom+xml' href='http://program-perl.blogspot.com/feeds/4852003189732933780/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://program-perl.blogspot.com/2012/03/timepiece.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/4852003189732933780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/545945377522867285/posts/default/4852003189732933780'/><link rel='alternate' type='text/html' href='http://program-perl.blogspot.com/2012/03/timepiece.html' title='Time:Piece'/><author><name>maeyan</name><uri>http://www.blogger.com/profile/09832364527648430343</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>