<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>taichino.com &#187; perl</title>
	<atom:link href="http://taichino.com/category/programming/perl-programming/feed" rel="self" type="application/rss+xml" />
	<link>http://taichino.com</link>
	<description>永遠のネバーランド</description>
	<lastBuildDate>Sat, 04 Feb 2012 13:33:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>[perl] ハッシュのスライスと多次元ハッシュのエミュレーション</title>
		<link>http://taichino.com/programming/1505</link>
		<comments>http://taichino.com/programming/1505#comments</comments>
		<pubDate>Thu, 28 Jan 2010 10:09:12 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[hash]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1505</guid>
		<description><![CDATA[XML::Simpleのコードを読んでいると以下の様な表現が頻繁に出てきました。問題は8行目なのですが、ハッシュをリストコンテキストで扱っているのですが、初めて見る表現で、調べるのにも少し手こずったのでメモしておきます。 #!/usr/bin/perl &#160; use Perl6::Say; use YAML; &#160; my @keys = qw&#40;key1 key2&#41;; my @vals = qw&#40;val1 val2&#41;; @dic&#123;@keys&#125; = @vals; # 問題の行 say Dump \%dic; &#160; # 出力は以下のようになります # --- # key1: val1 # key2: val2 結論から言えば、これはハッシュのスライスと呼ばれる表現で、配列のスライスと同様にハッシュの部分要素群を一度に扱う事ができます。上記の例では@が多数出てきて紛らわしいのですが、解り易く書くと以下のようになります。 #!/usr/bin/perl &#160; use Perl6::Say; use YAML; &#160; my @keys = qw&#40;key1 key2&#41;; my @vals = qw&#40;val1 val2&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://search.cpan.org/~grantm/XML-Simple-2.18/lib/XML/Simple.pm">XML::Simple</a>のコードを読んでいると以下の様な表現が頻繁に出てきました。問題は8行目なのですが、ハッシュをリストコンテキストで扱っているのですが、初めて見る表現で、調べるのにも少し手こずったのでメモしておきます。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> Perl6<span style="color: #339933;">::</span><span style="color: #006600;">Say</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> YAML<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #339933;">@</span><span style="color: #000066;">keys</span> <span style="color: #339933;">=</span> <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span>key1 key2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@vals</span> <span style="color: #339933;">=</span> <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span>val1 val2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">@dic</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">@</span><span style="color: #000066;">keys</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@vals</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;"># 問題の行</span>
say Dump <span style="color: #0000ff;">\%dic</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># 出力は以下のようになります</span>
<span style="color: #666666; font-style: italic;"># ---</span>
<span style="color: #666666; font-style: italic;"># key1: val1</span>
<span style="color: #666666; font-style: italic;"># key2: val2</span></pre></div></div>

<p><span id="more-1505"></span></p>
<p>結論から言えば、これはハッシュのスライスと呼ばれる表現で、配列のスライスと同様にハッシュの部分要素群を一度に扱う事ができます。上記の例では<strong>@</strong>が多数出てきて紛らわしいのですが、解り易く書くと以下のようになります。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> Perl6<span style="color: #339933;">::</span><span style="color: #006600;">Say</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> YAML<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #339933;">@</span><span style="color: #000066;">keys</span> <span style="color: #339933;">=</span> <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span>key1 key2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@vals</span> <span style="color: #339933;">=</span> <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span>val1 val2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">@dic</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'key1'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'key2'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@vals</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;"># 問題の行</span>
say Dump <span style="color: #0000ff;">\%dic</span><span style="color: #339933;">;</span></pre></div></div>

<p>このようにハッシュに対して@とブレース内でのキーを指定すると、ハッシュのスライスが扱えます。違和感があったのはハッシュをリストコンテキストで扱いながら、キーを同時に書いていた事なのですが、恥ずかしながら単純に知らないだけでした。それにしても、これは便利ですね。ちなみにpythonの辞書では使えません。残念です。</p>
<p>ところで紛らわしい事にハッシュの複数キーを扱う表現があります。例えば以下のコードを見て下さい。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> Perl6<span style="color: #339933;">::</span><span style="color: #006600;">Say</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> YAML<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">%scores</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$scores</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'taichino'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'math'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">60</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$scores</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'taichino'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'english'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">40</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$scores</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'mamino'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'math'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">50</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$scores</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'mamino'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'english'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">80</span><span style="color: #339933;">;</span>
&nbsp;
say <span style="color: #0000ff;">$scores</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'taichino'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'math'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;"># 60</span>
say <span style="color: #0000ff;">$scores</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'mamino'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'english'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;"># 80</span></pre></div></div>

<p>違いはハッシュのプリフィックスが@では無く$です。<a href="http://www.amazon.co.jp/gp/product/4873110963?ie=UTF8&#038;tag=creatorsland-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4873110963">プログラミングPerl</a><img src="http://www.assoc-amazon.jp/e/ir?t=creatorsland-22&#038;l=as2&#038;o=9&#038;a=4873110963" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />によるとこれは、多次元ハッシュのエミュレーションと呼ばれているようです。複数キーに対して値をマッピングしているので、確かに疑似多次元ハッシュとして使えますが、現在は使われていないようです。紛らわしいですね。</p>
<p>というわけで、まとめは以下になります。</p>
<ul>
<li>ハッシュのスライス<br />
<strong><font color="red">@</font>hash{key1,key2&#8230;}</strong></li>
<li>多次元ハッシュのエミュレーション<br />
<strong><font color="red">$</font>hash{key1, key2&#8230;}</strong></li>
</ul>
<p>ハッシュのスライスは便利なのでガンガン使って行きたいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1505/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CoroとthreadsとForkManagerでウェブページ取得の比較をしてみた</title>
		<link>http://taichino.com/programming/1142</link>
		<comments>http://taichino.com/programming/1142#comments</comments>
		<pubDate>Fri, 16 Oct 2009 09:14:02 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[coro]]></category>
		<category><![CDATA[forkmanager]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1142</guid>
		<description><![CDATA[以前Coroで効率よくスクレイピングなどと書いたんですが、恥ずかしながら書いた時はCoroがコルーチンを意味しているとは知らず、マルチスレッドを扱うライブラリだと認識していました。もう少し理解したいという事で、以下の３つの方法で並列にHTTPリクエストを発行して、その比較を行ってみました。 Coroによるマルチスレッド処理 threadsによるマルチスレッド処理 ForkManagerによるマルチプロセス処理 テストしてみたのは以下のコードです。Coroだけ別なのはCoro::LWPをインポートすると、LWPが全部Coro仕様に上書きされる為です。処理は、はてなブックマークのホットエントリのリストを取得して、リストのそれぞれのページへアクセスしてタイトルを取得するというものです。 #!/usr/bin/perl &#160; use strict; use warnings; use Perl6::Say; use YAML; &#160; use Time::HiRes; use threads&#40;&#41;; use LWP::Simple; use Web::Scraper; use Parallel::ForkManager; use IPC::Shareable; use Benchmark qw&#40;timethese cmpthese&#41;; &#160; my @links = test_urls&#40;&#41;; # ホットエントリのURLリストを取得して、 my $result = timethese&#40;10, &#123; # それぞれの方法で各URLのタイトルを取得するのを計測する 'single' =&#62; sub &#123; do_sthread&#40;\@links&#41;; &#125;, 'multi_thread' =&#62; sub [...]]]></description>
			<content:encoded><![CDATA[<p>以前<a href="http://taichino.com/programming/858">Coroで効率よくスクレイピング</a>などと書いたんですが、恥ずかしながら書いた時はCoroがコルーチンを意味しているとは知らず、マルチスレッドを扱うライブラリだと認識していました。もう少し理解したいという事で、以下の３つの方法で並列にHTTPリクエストを発行して、その比較を行ってみました。</p>
<ul>
<li>Coroによるマルチスレッド処理</li>
<li>threadsによるマルチスレッド処理</li>
<li>ForkManagerによるマルチプロセス処理</li>
</ul>
<p><span id="more-1142"></span></p>
<p>テストしてみたのは以下のコードです。Coroだけ別なのはCoro::LWPをインポートすると、LWPが全部Coro仕様に上書きされる為です。処理は、はてなブックマークのホットエントリのリストを取得して、リストのそれぞれのページへアクセスしてタイトルを取得するというものです。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Perl6<span style="color: #339933;">::</span><span style="color: #006600;">Say</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> YAML<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> Time<span style="color: #339933;">::</span><span style="color: #006600;">HiRes</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> threads<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> LWP<span style="color: #339933;">::</span><span style="color: #006600;">Simple</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Web<span style="color: #339933;">::</span><span style="color: #006600;">Scraper</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Parallel<span style="color: #339933;">::</span><span style="color: #006600;">ForkManager</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> IPC<span style="color: #339933;">::</span><span style="color: #006600;">Shareable</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Benchmark <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span>timethese cmpthese<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@links</span> <span style="color: #339933;">=</span> test_urls<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        <span style="color: #666666; font-style: italic;"># ホットエントリのURLリストを取得して、</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$result</span> <span style="color: #339933;">=</span> timethese<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>    <span style="color: #666666; font-style: italic;"># それぞれの方法で各URLのタイトルを取得するのを計測する</span>
	<span style="color: #ff0000;">'single'</span>       <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span> do_sthread<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">\@links</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	<span style="color: #ff0000;">'multi_thread'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span> do_mthread<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">\@links</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	<span style="color: #ff0000;">'fork_manager'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span> do_mprocess<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">\@links</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
cmpthese<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">exit</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># はてなブックマークから現在のホットエントリーのURLリストを取得</span>
<span style="color: #000000; font-weight: bold;">sub</span> test_urls <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$source</span>  <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;http://b.hatena.ne.jp/hotentry&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$scraper</span> <span style="color: #339933;">=</span> scraper <span style="color: #009900;">&#123;</span>
		process <span style="color: #ff0000;">'//div[@class=&quot;entry-body&quot;]/h3/a'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'links[]'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'@href'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">return</span> <span style="color: #339933;">@</span><span style="color: #009900;">&#123;</span><span style="color: #0000ff;">$scraper</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">scrape</span><span style="color: #009900;">&#40;</span>get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$source</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'links'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># 指定したURLにあるページのタイトルを取得する</span>
<span style="color: #000000; font-weight: bold;">sub</span> get_title <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$url</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$scraper</span> <span style="color: #339933;">=</span> scraper <span style="color: #009900;">&#123;</span>
		process <span style="color: #ff0000;">'//title'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'title'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'TEXT'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">return</span> <span style="color: #0000ff;">$scraper</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">scrape</span><span style="color: #009900;">&#40;</span>get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'title'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># シングルスレッドでリクエストを発行</span>
<span style="color: #000000; font-weight: bold;">sub</span> do_sthread <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$links</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$t1</span> <span style="color: #339933;">=</span> Time<span style="color: #339933;">::</span><span style="color: #006600;">HiRes</span><span style="color: #339933;">::</span><span style="color: #000066;">time</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@result</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$link</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@$links</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">push</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@result</span><span style="color: #339933;">,</span> get_title<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$link</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	say <span style="color: #ff0000;">&quot;Single Thread Time took: &quot;</span><span style="color: #339933;">,</span> Time<span style="color: #339933;">::</span><span style="color: #006600;">HiRes</span><span style="color: #339933;">::</span><span style="color: #000066;">time</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">$t1</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">return</span> <span style="color: #0000ff;">@result</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># マルチスレッドでリクエストを発行</span>
<span style="color: #000000; font-weight: bold;">sub</span> do_mthread <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$links</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$t1</span> <span style="color: #339933;">=</span> Time<span style="color: #339933;">::</span><span style="color: #006600;">HiRes</span><span style="color: #339933;">::</span><span style="color: #000066;">time</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@threads</span> <span style="color: #339933;">=</span> <span style="color: #000066;">map</span> <span style="color: #009900;">&#123;</span>
		threads<span style="color: #339933;">-&gt;</span><span style="color: #006600;">create</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">\&amp;get_title</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$_</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #0000ff;">@$links</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@result</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">push</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@result</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$_</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">join</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">for</span> <span style="color: #0000ff;">@threads</span><span style="color: #339933;">;</span>
&nbsp;
	say <span style="color: #ff0000;">&quot;Multi Thread Time took: &quot;</span><span style="color: #339933;">,</span> Time<span style="color: #339933;">::</span><span style="color: #006600;">HiRes</span><span style="color: #339933;">::</span><span style="color: #000066;">time</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">$t1</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">return</span> <span style="color: #0000ff;">@result</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Paralell::ForkManagerで並列処理</span>
<span style="color: #000000; font-weight: bold;">sub</span> do_mprocess <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$links</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$t1</span> <span style="color: #339933;">=</span> Time<span style="color: #339933;">::</span><span style="color: #006600;">HiRes</span><span style="color: #339933;">::</span><span style="color: #000066;">time</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$pm</span> <span style="color: #339933;">=</span> Parallel<span style="color: #339933;">::</span><span style="color: #006600;">ForkManager</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$handle</span> <span style="color: #339933;">=</span> <span style="color: #000066;">tie</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@result</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'IPC::Shareable'</span><span style="color: #339933;">,</span> <span style="color: #000066;">undef</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> destroy <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">@result</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$link</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@$links</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #0000ff;">$pm</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">start</span> <span style="color: #b1b100;">and</span> <span style="color: #b1b100;">next</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$title</span> <span style="color: #339933;">=</span> get_title<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$link</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$handle</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">shlock</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">push</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@result</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$title</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$handle</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">shunlock</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$pm</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">finish</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #0000ff;">$pm</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">wait_all_children</span><span style="color: #339933;">;</span>
	say <span style="color: #ff0000;">&quot;Multi Process Time took: &quot;</span><span style="color: #339933;">,</span> Time<span style="color: #339933;">::</span><span style="color: #006600;">HiRes</span><span style="color: #339933;">::</span><span style="color: #000066;">time</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">$t1</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">return</span> <span style="color: #0000ff;">@result</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>以下はCoroのテスト。一部省略。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Coro<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Coro<span style="color: #339933;">::</span><span style="color: #006600;">LWP</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> do_coro <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$links</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$t1</span> <span style="color: #339933;">=</span> Time<span style="color: #339933;">::</span><span style="color: #006600;">HiRes</span><span style="color: #339933;">::</span><span style="color: #000066;">time</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@coro</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">@result</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$link</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@$links</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">push</span> <span style="color: #0000ff;">@coro</span><span style="color: #339933;">,</span> async <span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">push</span> <span style="color: #0000ff;">@result</span><span style="color: #339933;">,</span> get_title<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$link</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #0000ff;">$_</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">join</span> <span style="color: #b1b100;">for</span> <span style="color: #0000ff;">@coro</span><span style="color: #339933;">;</span>
	say <span style="color: #ff0000;">&quot;Coro Time took: &quot;</span><span style="color: #339933;">,</span> Time<span style="color: #339933;">::</span><span style="color: #006600;">HiRes</span><span style="color: #339933;">::</span><span style="color: #000066;">time</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">$t1</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">return</span> <span style="color: #0000ff;">@result</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>で、結論をはしょって書くと以下のようになりました。singleというのはリクエストを並列化せずに行ったものです。</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">fork_manager: 313 wallclock secs ( 0.11 usr 0.59 sys + 159.14 cusr 30.70 csys = 190.54 CPU) @ 14.29/s (n=10)
multi_thread: 250 wallclock secs (179.52 usr + 10.47 sys = 189.99 CPU) @  0.05/s (n=10)
coro:         220 wallclock secs (118.99 usr +  3.32 sys = 122.31 CPU) @  0.08/s (n=10)
single:       714 wallclock secs (127.31 usr +  4.17 sys = 131.48 CPU) @  0.08/s (n=10)</pre></div></div>

<p>予想に反して、coroがwallclockを見てもCPU負荷を見ても性能が良いと出ています。(個人的にはthreadsが一番早いと思っていました。)厳密に測定してないので、あくまで参考程度ですが。</p>
<p>以上で、結論としてはソースコードも短くて簡潔ですし、コルーチン的な機能は何も使ってないけど、Coroをクローラ用途で使ってもいいじゃない！ってところです。あとテストコードは<a href="http://github.com/taichino/snippet/tree/master/perl/parallel_test/">これ</a>です。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1142/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PadWalkerでmy変数のシンボルテーブルを取得する</title>
		<link>http://taichino.com/programming/1127</link>
		<comments>http://taichino.com/programming/1127#comments</comments>
		<pubDate>Thu, 15 Oct 2009 07:36:49 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[padwalker]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1127</guid>
		<description><![CDATA[最近perlのスタッシュと言う単語を覚えました。所謂パッケージスコープのシンボルテーブルで特定のパッケージ内に定義されている関数や変数の情報を得る事が出来ます。詳細は以下のページが解り易かったです。 wakaponさんの備忘帳 さて問題は何かというと、上記ページにも書かれているように、my変数がスタッシュではなく、別のスクラッチパッドと呼ばれる領域に格納されるため、スタッシュからはアクセスできないという事です。 定義されているmy変数のリストも取得したいと思い調べてみると、PadWalkerというモジュールに行き着きました。このモジュールを使うと、なんとスクラッチパッドの読み書きが出来ます。例えば以下のようにして使用します。 #!/usr/bin/perl &#160; use strict; use warnings; use PadWalker qw&#40;peek_my peek_our&#41;; use Data::Dumper; &#160; my $scalar = &#34;hello&#34;; my @list = &#40;1,2,3&#41;; our %hash = &#40;item1 =&#62; 'val1', item2 =&#62; 'val2'&#41;; print Dumper peek_my&#40;0&#41;; # このスコープで定義されているmy変数のハッシュを見る print Dumper peek_our&#40;0&#41;; # our変数を見る事も出来る &#160; # ハッシュ経由で変数を弄る事も出来る $&#123;peek_my&#40;0&#41;-&#62;&#123;'$scalar'&#125;&#125; .= &#34; world&#34;; print $scalar . &#34;\n&#34;; [...]]]></description>
			<content:encoded><![CDATA[<p>最近perlのスタッシュと言う単語を覚えました。所謂パッケージスコープのシンボルテーブルで特定のパッケージ内に定義されている関数や変数の情報を得る事が出来ます。詳細は以下のページが解り易かったです。</p>
<p><a href="http://pub.ne.jp/wakapon/?entry_id=1714539" class="broken_link">wakaponさんの備忘帳</a></p>
<p>さて問題は何かというと、上記ページにも書かれているように、my変数がスタッシュではなく、別のスクラッチパッドと呼ばれる領域に格納されるため、スタッシュからはアクセスできないという事です。</p>
<p><span id="more-1127"></span></p>
<p>定義されているmy変数のリストも取得したいと思い調べてみると、<a href="http://search.cpan.org/~robin/PadWalker-1.9/PadWalker.pm">PadWalker</a>というモジュールに行き着きました。このモジュールを使うと、なんとスクラッチパッドの読み書きが出来ます。例えば以下のようにして使用します。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> PadWalker <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span>peek_my peek_our<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dumper</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$scalar</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;hello&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@list</span>   <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">our</span> <span style="color: #0000ff;">%hash</span>  <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>item1 <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'val1'</span><span style="color: #339933;">,</span> item2 <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'val2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> Dumper peek_my<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;"># このスコープで定義されているmy変数のハッシュを見る</span>
<span style="color: #000066;">print</span> Dumper peek_our<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;"># our変数を見る事も出来る</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># ハッシュ経由で変数を弄る事も出来る</span>
<span style="color: #0000ff;">$</span><span style="color: #009900;">&#123;</span>peek_my<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'$scalar'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">.=</span> <span style="color: #ff0000;">&quot; world&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> <span style="color: #0000ff;">$scalar</span> <span style="color: #339933;">.</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>      <span style="color: #666666; font-style: italic;"># hello world</span></pre></div></div>

<p>上記プログラムのpeek_my(0)のダンプ結果は以下のようになります。ばっちり思った結果が得られていますね。</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$VAR1 = {
          '$scalar' =&gt; \'hello',
          '@list' =&gt; [
                       1,
                       2,
                       3
                     ]
        };</pre></div></div>

<p>これでスタッシュ経由でグローバル変数、スクラッチパッド経由でmy変数を、それぞれハッシュで得られるようになりました。だから何だという話もありますが、僕はperlのビギナーなので、Cやjavaの感覚でperlのプログラムを書いて、挙動が思ったようにならない事がよくあります。そんな時にシンボルテーブルどうなってるの？と確認できるのは結構便利です。ここ数時間あれこれダンプしすぎて作業が進みませんが。。</p>
<p>さておまけですが、このPadWalkerを使うと別のスコープのmy変数にアクセスできます。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> modify_var <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$var_name</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># peek_my(1)で一つ上のスコープのスクラッチパッドにアクセスできる。</span>
	<span style="color: #0000ff;">$</span><span style="color: #009900;">&#123;</span>peek_my<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #0000ff;">$var_name</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;modified&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$data</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'new data'</span><span style="color: #339933;">;</span>
modify_var<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'$data'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> <span style="color: #0000ff;">$data</span> <span style="color: #339933;">.</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;"># modified</span></pre></div></div>

<p>こんな事されるとレキシカルスコープ危うしですね。使い道も今のところ思いつきません。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1127/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>perlでモジュールのimportとunimport</title>
		<link>http://taichino.com/programming/1116</link>
		<comments>http://taichino.com/programming/1116#comments</comments>
		<pubDate>Thu, 15 Oct 2009 00:33:39 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1116</guid>
		<description><![CDATA[perlでモジュールをインポートする時に何気なく使ってるuse Hogeですが、調べてみると少し思ってたのと違ってたので、調べた事をメモしておきます。 use Hogeは実は標準関数useの呼出しを行っていて、その内容は以下と同等です。 BEGIN &#123; require Hoge; # 中で更にdo Hoge.pmを呼び出す import Hoge; # Hoge::importを実行 &#125; require Hogeは対応する.pmファイルを読み込み、importはHoge::importを呼び出します。requireされた時点でロードは完了して、Hoge.pmに定義されている関数等は使用可能です。じゃあimportで何をしてるかというと、読み込み元パッケージの名前空間にHoge.pm内の関数に対するエイリアスを定義する為に使われる事が多いようです。 逆にモジュールをunimportしたい場合はno Moduleを使います。no ModuleとするとModule::unimportが呼び出されます。no strict &#8216;refs&#8217;等はよく見かけますね。ここで注意したいのはno Moduleを呼び出したからといってModuleが無効化されるとは限らないという事です。あくまでもModule::unimportが呼ばれるだけです。またunimportが実装されていないモジュールに対しては何も起こりません。 という事は一度importしてしまうとunimportできない場合も多いので、そもそもimportしたくないという状況がたまにあります。そういう時はどうすれば良いかというと、use Hoge()を使います。Hogeの後に括弧が付くとimportが呼ばれず以下と等しくなります。 BEGIN &#123; require Hoge; &#125; どういう時に使うのかというと、別々のモジュールから同じ名前の識別子がimportされてしまうのを回避するのに使えます。例えばthreadsとCoroにはasyncという関数が定義されていて、同一パッケージ内で一緒にuseするとエラーがでるわけですが、use threads()、use Coro()とする事でエラーを回避できます。他にも使い道があるかもしれませんが、今のところ思いつきません。あったら教えて下さい。 #!/usr/bin/perl &#160; package import_test; use threads; use Coro; # ここでエラーが出る。エラー内容は以下。 # Prototype mismatch: sub import_test::async (&#38;;@) vs (&#38;@) at /Library/Perl/Updates/5.8.8/Exporter.pm line [...]]]></description>
			<content:encoded><![CDATA[<p>perlでモジュールをインポートする時に何気なく使ってるuse Hogeですが、調べてみると少し思ってたのと違ってたので、調べた事をメモしておきます。</p>
<p><span id="more-1116"></span></p>
<p>use Hogeは実は<strong>標準関数useの呼出し</strong>を行っていて、その内容は以下と同等です。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">BEGIN</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">require</span> Hoge<span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;"># 中で更にdo Hoge.pmを呼び出す</span>
    <span style="color: #000066;">import</span> Hoge<span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;"># Hoge::importを実行</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>require Hogeは対応する.pmファイルを読み込み、importはHoge::importを呼び出します。requireされた時点でロードは完了して、Hoge.pmに定義されている関数等は使用可能です。じゃあimportで何をしてるかというと、読み込み元パッケージの名前空間にHoge.pm内の関数に対するエイリアスを定義する為に使われる事が多いようです。</p>
<p>逆にモジュールをunimportしたい場合はno Moduleを使います。no ModuleとするとModule::unimportが呼び出されます。no strict &#8216;refs&#8217;等はよく見かけますね。ここで注意したいのは<strong>no Moduleを呼び出したからといってModuleが無効化されるとは限らない</strong>という事です。あくまでもModule::unimportが呼ばれるだけです。またunimportが実装されていないモジュールに対しては何も起こりません。</p>
<p>という事は一度importしてしまうとunimportできない場合も多いので、そもそもimportしたくないという状況がたまにあります。そういう時はどうすれば良いかというと、use Hoge()を使います。Hogeの後に括弧が付くとimportが呼ばれず以下と等しくなります。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">BEGIN</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">require</span> Hoge<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>どういう時に使うのかというと、別々のモジュールから同じ名前の識別子がimportされてしまうのを回避するのに使えます。例えばthreadsとCoroにはasyncという関数が定義されていて、同一パッケージ内で一緒にuseするとエラーがでるわけですが、use threads()、use Coro()とする事でエラーを回避できます。他にも使い道があるかもしれませんが、今のところ思いつきません。あったら教えて下さい。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000066;">package</span> import_test<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> threads<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Coro<span style="color: #339933;">;</span>       <span style="color: #666666; font-style: italic;"># ここでエラーが出る。エラー内容は以下。</span>
<span style="color: #666666; font-style: italic;"># Prototype mismatch: sub import_test::async (&amp;;@) vs (&amp;@) at /Library/Perl/Updates/5.8.8/Exporter.pm line 67.</span>
&nbsp;
<span style="color: #000066;">package</span> main<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> threads<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;"># importさせなければエラーは出ない</span>
<span style="color: #000000; font-weight: bold;">use</span> Coro<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>ところで、useはBEGINブロックに置き換わると等しいと書きましたが、本当かどうか解らなかったので、確認したいなぁと思って探していると<a href="http://search.cpan.org/~dapm/perl-5.10.1/ext/B/B/Deparse.pm">Deparse</a>というモジュールを使うと良いと解りました。試しに以下のコードを<strong>perl -MO=Deparse,-x5 test.pl</strong>としてみましょう。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> threads<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;"># importなし</span>
<span style="color: #000000; font-weight: bold;">use</span> Coro<span style="color: #339933;">;</span>         <span style="color: #666666; font-style: italic;"># importあり</span></pre></div></div>

<p>そうすると以下の様な出力が得られます。Deparseはスクリプトの解析結果を出力するモジュールで、-xオプションで指定する出力レベルを上げると、より内部構造に近い形でスクリプトを見る事が出来ます。実際にBEGINブロックが得られていて、threadsのimportが呼ばれず、Coroのimportが呼ばれている事も確認できますね。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">BEGIN</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">require</span> threads<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">BEGIN</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">require</span> Coro<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #ff0000;">'Coro'</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">import</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>まとめ</strong></p>
<ul>
<li>perlのuseは他の言語とは違って、標準関数の１つ。perldoc -f use参照</li>
<li>use Module、no Moduleされた時の挙動もモジュールに依存してる。</li>
<li>なんか変だと感じたらとりあえずDeparse、その後モジュールのimportのコードを読む。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1116/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[メモ] TheSchwartzのサンプルコード</title>
		<link>http://taichino.com/programming/1068</link>
		<comments>http://taichino.com/programming/1068#comments</comments>
		<pubDate>Sun, 11 Oct 2009 09:44:14 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[theschwartz]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1068</guid>
		<description><![CDATA[遅まきながらJobキューを使いたくて、あれこれかじっています。perlだとTheSchwartzがメジャーな雰囲気だったので試してみました。 準備 まずjobキュー用のデータベースを準備します。上記ページには説明がありませんが、スキーマもCPANにあがっています。ここではtheschwartzという名前のデータベースをdb_userユーザから使っています。 $ wget http://search.cpan.org/src/BRADFITZ/TheSchwartz-1.07/doc/schema.sql $ mysqladmin -u root create theschwartz $ mysql -u root theschwartz &#60; schema.sql $ mysql -u root &#62; grant all on theschwartz.* to db_user@localhost identified by 'db_pass'; ジョブの追加処理 まずキューにジョブを追加します。ジョブの追加はTheSchwartz本体でも出来ますが、不要なオブジェクトのロードが走らないのでTheSchwartz::Simpleを使うのが良いようです。 #!/usr/bin/perl &#160; use strict; use warnings; use Perl6::Say; &#160; use DBI; use TheSchwartz::Simple; &#160; my $dbh = DBI-&#62;connect&#40;'dbi:mysql:theschwartz', 'db_user', 'db_pass'&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p>遅まきながらJobキューを使いたくて、あれこれかじっています。perlだと<a href="http://search.cpan.org/~bradfitz/TheSchwartz-1.07/lib/TheSchwartz.pm">TheSchwartz</a>がメジャーな雰囲気だったので試してみました。</p>
<p><span id="more-1068"></span></p>
<p><strong>準備</strong><br />
まずjobキュー用のデータベースを準備します。上記ページには説明がありませんが、スキーマも<a href="http://cpansearch.perl.org/src/BRADFITZ/TheSchwartz-1.07/doc/">CPANにあがっています</a>。ここではtheschwartzという名前のデータベースをdb_userユーザから使っています。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>search.cpan.org<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>BRADFITZ<span style="color: #000000; font-weight: bold;">/</span>TheSchwartz-<span style="color: #000000;">1.07</span><span style="color: #000000; font-weight: bold;">/</span>doc<span style="color: #000000; font-weight: bold;">/</span>schema.sql
$ mysqladmin <span style="color: #660033;">-u</span> root create theschwartz
$ mysql <span style="color: #660033;">-u</span> root theschwartz <span style="color: #000000; font-weight: bold;">&lt;</span> schema.sql
$ mysql <span style="color: #660033;">-u</span> root
<span style="color: #000000; font-weight: bold;">&gt;</span> grant all on theschwartz.<span style="color: #000000; font-weight: bold;">*</span> to db_user<span style="color: #000000; font-weight: bold;">@</span>localhost identified by <span style="color: #ff0000;">'db_pass'</span>;</pre></div></div>

<p><strong>ジョブの追加処理</strong><br />
まずキューにジョブを追加します。ジョブの追加はTheSchwartz本体でも出来ますが、不要なオブジェクトのロードが走らないのでTheSchwartz::Simpleを使うのが良いようです。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Perl6<span style="color: #339933;">::</span><span style="color: #006600;">Say</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> DBI<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> TheSchwartz<span style="color: #339933;">::</span><span style="color: #006600;">Simple</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dbh</span> <span style="color: #339933;">=</span> DBI<span style="color: #339933;">-&gt;</span><span style="color: #006600;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'dbi:mysql:theschwartz'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'db_user'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'db_pass'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$client</span> <span style="color: #339933;">=</span> TheSchwartz<span style="color: #339933;">::</span><span style="color: #006600;">Simple</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$dbh</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$id</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">insert</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'SampleWorker'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'data'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #339933;">@</span><span style="color: #000000; font-weight: bold;">ARGV</span> <span style="color: #339933;">?</span> <span style="color: #0000ff;">$ARGV</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
say <span style="color: #ff0000;">&quot;job $id is inserted&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>ジョブを実行する処理</strong><br />
ジョブの実行はTheSchwartz本体で行います。TheSchwartz::Workerのサブクラスでジョブの実行処理を記述し、そのクラスを$TheSchwartz->can_doで指定します。後は$TheSchwartz->workでひたすらキューに入ったジョブを実行し続けてくれます。下記コードでは実行した事をログに残すだけのジョブを処理しています。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
<span style="color: #000066;">package</span> SampleWorker<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> base <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span>TheSchwartz<span style="color: #339933;">::</span><span style="color: #006600;">Worker</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> Perl6<span style="color: #339933;">::</span><span style="color: #006600;">Say</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> IO<span style="color: #339933;">::</span><span style="color: #006600;">File</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> work <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$job</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
&nbsp;
	say <span style="color: #ff0000;">&quot;working&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$file</span> <span style="color: #339933;">=</span> IO<span style="color: #339933;">::</span><span style="color: #006600;">File</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">open</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'work.txt'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'a'</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">or</span> <span style="color: #000066;">die</span> <span style="color: #0000ff;">$!</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$job</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">arg</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'data'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">.</span> <span style="color: #ff0000;">&quot; is done<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #0000ff;">$job</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">completed</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000066;">package</span> main<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> TheSchwartz<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$worker</span> <span style="color: #339933;">=</span> TheSchwartz<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span>
	databases <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#123;</span>
		dsn  <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'dbi:mysql:theschwartz'</span><span style="color: #339933;">,</span>
		user <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_user'</span><span style="color: #339933;">,</span>
		pass <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_pass'</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$worker</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">can_do</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'SampleWorker'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$worker</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">work</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>割とシンプルに使えていいですね。TheSchwartzってネーミングがよく解りませんけども。<br />
後でQ4Mと使い比べてみようと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1068/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

