Hatena::Groupperl

Perl Study Memory

There is a difference between knowing the path and walking the path.

自己紹介  | 初めてのPerl 第3版  | 続・初めてのPerl 改訂版  | アーカイブ  | 参考書籍・推薦図書

2010-06-10

podテスト

| 22:16 | はてなブックマーク - podテスト - Perl Study Memory

こんばんは、AzureStoneです。

ちょっとメモです。

これは、単なるメモです。

=head1 NAME

  Acme::AzureStone

=head1 TEST

    O/Rマッパー。

=head2 hogehoge

    私の名前は、AzureStone(あーじゅ・すとーん)です。

=cut


f:id:azurestone:20100611002842j:image

MaryellenMaryellen2011/06/05 09:34Ppl like you get all the brnais. I just get to say thanks for he answer.

xfwihixfwihi2011/06/05 17:469QZs1v <a href="http://cickdsiebidm.com/">cickdsiebidm</a>

uxheayuxheay2011/06/06 22:32bDT4TJ , [url=http://ezlhvpbehefi.com/]ezlhvpbehefi[/url], [link=http://pcznupruaioq.com/]pcznupruaioq[/link], http://wlkeuzdvnivl.com/

burlddhjedoburlddhjedo2011/06/09 19:089MwxpI , [url=http://xlxqhaedixie.com/]xlxqhaedixie[/url], [link=http://ncnvctuxilof.com/]ncnvctuxilof[/link], http://mrlfglqczjpq.com/

AndresAndres2012/08/19 19:54Taking the ovvreeiw, this post hits the spot

rakgrkjpsrakgrkjps2012/08/20 18:04yk3SCX <a href="http://vzkuonfbstpm.com/">vzkuonfbstpm</a>

umylmmumylmm2012/08/22 01:08VVdkBp , [url=http://qwjswnqmablz.com/]qwjswnqmablz[/url], [link=http://ddocgmthancv.com/]ddocgmthancv[/link], http://aevhqvdcqzld.com/

wvwyvmnwvwyvmn2012/08/22 14:21LAH5sz <a href="http://nqjectpicopn.com/">nqjectpicopn</a>

2010-04-02

Perlポケットリファレンスは、もう必要ない?

| 00:32 | はてなブックマーク - Perlポケットリファレンスは、もう必要ない? - Perl Study Memory

こんばんは、AzureStone(あーじゅ・すとーん)です。

今日は、職場に新しい方がいらしたので激しく緊張した今日この頃です。

さて、先日のuse utf8;を調べていた際に気づいたことがあったのでそれについてお話しします。

先に結論から言うとperlについて分からないことがあれば、まずGoogleや書籍に走るのではなくperldoc.jpで調べ物した方がよいということでしょうか。

本当は、かっこよく「Perl programming documentation - perldoc.perl.orgを読むべきです」と言うべきなんでしょうが、、、

なにせTOEIC 200点の私には、とてもじゃないですが、そんなこと胸を張って言えません。

あっ、最新ですと155点でした。すいません、見栄張っていました。

何故、そのような結論を出したのかを説明したいと思います。

ちなみにこれが正しい手法だと主張しているわけではありません!!!

初心者の方、注意してくださいね!

ちなみに僕は立場上、素人と言えても初心者とはもう語れなくなったのでどうしたものか・・・。

この文章で間違っているところがあれば教えてください!!!!!!お願いします。

先日、コメントである方からlength()の仕様について教えて頂きました。

それまでlength()は、バイト数を計算するものだとばかり思っていました。utf8プラグマを使用することでどっかでいい感じにlengthに文字数を代入してくれているものばかりだとも勝手に思っていました。

ところが、先日いただいたコメントを読んでみるとこれまで思っていたlength()の仕様とは大きく違いました。どうしてそんな挙動を知っているだろうか?と考えていました。またスーパーハッカー特有のソースコードを読めばわかるという類のものなのかとばかり考えていました。しばらくそれを検証するにはどうしたらいいのか考えてました。Googleでlength()を検索していました。ヒットした情報がたくさんありました。一つだけマニアックな情報を除いては、僕の認識を大きく変えるようなことを記したWebサイトは見つかりませんでした。しかし5分ぐらい経った頃、perldoc perlfuncを読めばいいことに気がつき、以下のように実行してみました。

ところが、

azurestone@nsa01:~$ perldoc -f length
  length EXPR
  length  Returns the length in characters of the value of EXPR.  If EXPR is omitted, returns length of $_.  Note that
          this cannot be used on an entire array or hash to find out how many elements these have.  For that, use "scalar
          @array" and "scalar keys %hash" respectively.

          Note the characters: if the EXPR is in Unicode, you will get the number of characters, not the number of bytes.
          To get the length of the internal string in bytes, use "bytes::length(EXPR)", see bytes.  Note that the
          internal encoding is variable, and the number of bytes usually meaningless.  To get the number of bytes that
          the string would have when encoded as UTF-8, use "length(Encoding::encode_utf8(EXPR))".
azurestone@nsa01:~$

期待は、していませんでしたがやっぱり英語でした。これくらいの英文だったら和訳しながら読もうかと思いましたが、すぐに飽きてきました。いえ飽きたというよりも早く先に進みたいといったところでしょうか?

そんなこんなでだめもとでGoogleの検索エンジンで

site:perldoc.jp  length

と入力し検索してみるとあらっ!まぁ!なんと!今使っているPerl 5.10.0の情報が出てきます。

非常に驚きました。何故、驚いたかというとperldoc.jpって僕の中では、もう終わった古いプロジェクトだと思っていたからです。それは、僕の勝手な思い込みでした。どうやら調べてみると目立ってはいませんが、現在進行中のプロジェクトのようです。

そう判断するに至ったURLを載せておきます。

石垣さんが執筆されている情報の方が、わかりやすいと思います。charsbarさんの方は、少し(?)過激な表現が多いので読むと驚くかもしれません。。。

もしかしたら他のドキュメントも日本語化されているのではと期待を胸に膨らましつつディレクトリを掘ってみると期待通り良いドキュメントがありました!!!

URLを下記に載せておきます。


これを読んで理解すればスーパーハッカーに近づけるかも?と思ったぐらいでした。

ということで今回は、Googleで無闇矢鱈に関数を検索するよりもperldoc.jpで探せばちゃんと正しい情報が手に入りますよ!ということを伝えたかったです。

ちなみにlength()をGoogleで検索したときに見たWebサイト

これを見ている方へperldoc.jpと上記のサイトを比べてみてください。あることに気がつくと思います。

気がついたことは、胸にそっとしまっておきましょう。。。

さて次回は、perldoc.jpからデータをダウンロードしてvimから特定の関数を検索するまでをやってみたいと思います。ちなみに現時点でまだ実現していません。理由は、またもやUTF-8EUC-JPにやられています。汗、、、

まあ、ここさえ頑張ればオフラインでも開発が、できるのでやってみようと思います。

(;^_^A アセアセ…

本日おすすめの関連書籍

CGI & Perl ポケットリファレンス (Pocket reference)

CGI & Perl ポケットリファレンス (Pocket reference)

vkgtarovkgtaro2010/04/02 20:24石垣さんと charsbar さんは同一人物ですw

azurestoneazurestone2010/04/02 23:52(;^_^A アセアセ…

とおりすがりとおりすがり2010/04/10 13:36英語のドキュメントでもしつこいくらい読み続けるとTOEICの点数が職場で最低点だった自分でも読める様になりましたよ。しつこくって所がポイントです。

WillieWillie2011/06/05 18:46Hey, good to find someone who argees with me. GMTA.

rkfcbwprkfcbwp2011/06/06 18:32HDmKy5 <a href="http://fvgpuqvtsdpc.com/">fvgpuqvtsdpc</a>

uduglicvuduglicv2011/06/06 22:31pCSv4t , [url=http://yuhhwvclovrx.com/]yuhhwvclovrx[/url], [link=http://melhhngjdewk.com/]melhhngjdewk[/link], http://csaqnlvmtrvm.com/

vwhkoevwhkoe2011/06/07 18:353CLyhu <a href="http://vurzmcnhhpld.com/">vurzmcnhhpld</a>

mneatromneatro2011/06/09 18:53JmJS8Z , [url=http://whedsvidgsex.com/]whedsvidgsex[/url], [link=http://vdpwielxyfii.com/]vdpwielxyfii[/link], http://borwpxxvvclr.com/

AnjaliAnjali2012/08/20 16:03Craeted the greatest articles, you have.

bthytucuvrbthytucuvr2012/08/21 17:12WoUo2k <a href="http://djfitcsgegfk.com/">djfitcsgegfk</a>

czpvbunczpvbun2012/08/22 15:44CKNas2 <a href="http://vzbxflfdcblg.com/">vzbxflfdcblg</a>

wdsyojhiippwdsyojhiipp2012/08/24 22:33P3Ry1j , [url=http://sukvdvpgpgcy.com/]sukvdvpgpgcy[/url], [link=http://tsetsqtieicy.com/]tsetsqtieicy[/link], http://qpbfygcwccgp.com/

2010-03-31

no utf8;ができない

| 00:32 | はてなブックマーク - no utf8;ができない - Perl Study Memory

こんばんは、AzureStone(あーじゅ・すとーん)です。

文字コードも大切だと思い、use utf8;を今一度しっかり(論理的に)理解しようと思い下記のようなコードを書いてました。

utf801.pl

#!/usr/bin/perl -l

use strict;
use warnings;
use utf8;

my $str = 'あいうえお';
print length($str);

1;

実行結果

azurestone@nsa01:~/tmp/perl/use_utf8$ ./utf801.pl 
5
azurestone@nsa01:~/tmp/perl/use_utf8$ 

実行してみると上記のように当然の結果でした。

次に下記のようにコードを書いてみました。

utf802.pl

#!/usr/bin/perl -l

use strict;
use warnings;

my $str = 'あいうえお';
print length($str);

1;

実行結果

azurestone@nist01:~/tmp/perl/use_utf8$ ./utf802.pl 
15
azurestone@nist01:~/tmp/perl/use_utf8$ 

私にとっては、上記の実行結果も想定範囲内でした。

そして次にこういう検証のコードを一つにまとめようと思い下記のようにコーディングしました。


utf803.pl

#!/usr/bin/perl -l

use strict;
use warnings;
use utf8;

my $str = 'あいうえお';

print length($str);

no utf8;
print length($str);
1;

このソースコードの意図は、use warnings;をno warnings;と同じ感覚でuse utf8;をno utf8;にしました。

ところが、、、私の予想とは裏腹に結果は、以下のようになってしまいました。

実行結果

azurestone@nist01:~/tmp/perl/use_utf8$ ./utf803.pl 
5
5
azurestone@nist01:~/tmp/perl/use_utf8$ 

私が、想定していたのは、下記のとおりです。

5
15

でも結果は、違いました。

そこで私は、今度はこう書きました。

utf804.pl

#!/usr/bin/perl -l

use strict;
use warnings;
use utf8;

my $str = 'あいうえお';

print length($str);

{
  no utf8;
  print length($str);
}

1;

根拠はないですが、もしかしたらこれならいけるか?と思い実行してみました。

実行結果

azurestone@nsa01:~/tmp/perl/use_utf8$ ./utf804.pl 
5
5
azurestone@nsa01:~/tmp/perl/use_utf8$ 

またしても期待した結果になりませんでした。。。

なぜなんでしょうか?通常、noとすればそれ以降、プラグマが無効になると思っていました。

ところが、今日やったコードではできなかった。

仮にできる方法があったとにしてもこのコードが、動かない理由が知りたい。。。

つまり、no utf8;をする方法ではなく何故、no utf8;が動かないのか?

そこが知りたい。。。誰か教えて欲しいです。。。



本日おすすめの関連書籍

tokuhiromtokuhirom2010/03/31 01:48use utf8; プラグマは、length() 関数にきいているのではなく、文字列リテラルにたいしてきいています。
utf8 プラグマは「Perl に script が UTF-8 で書かれているということを教える」ためのものですから、use utf8 されて以後の文字列リテラルにたいして utf8 flag を付与します。

組み込み関数 length() は、utf8 flag がついていれば文字数をかえし、そうでなければバイト数をかえす、という挙動をするにすぎません。

azurestoneazurestone2010/04/01 01:01tokuhiromさん、またコメントありがとうございます!!
とっても嬉しいです!

僕の力量不足でコメント欄で簡潔に回答できなかったので記事を書いてみました。(;^_^A アセアセ…
http://perl.g.hatena.ne.jp/azurestone/20100401/1270050205

ヾ(*´∀`*)ノ ありがとうございます!