UTF8 フラグあれこれ - daily dayflower について nobuoka さんよりツッコミをいただきました。 nobuoka 2008/03/11 21:15 こんにちは。”[Perl] Perl の Unicode 対応について” のエントリでトラックバックさせて頂きました nobuoka です。 内部表象 (内部形式: internal format) について気になる点があったのでいろいろ調べていたのですが、「内部形式は UTF-8 ではなく Unicode コードポイントをバイナリ化したものである」という結論に達しました。たとえば「é」という文字は内部形式では ¥xE9 というバイナリデータとして保持されているという結論に達しました。それは utf8 フラグが付いていても付いていなくても同様です。 つまり、このエントリで述べられている (A) 文字列(内部表象: UT
id:It_lives_vainly:20080310 で書いた、Perlの文字コード変換の話の続きっぽい話です。 さて、perlでは、ファイルハンドルのフォーマットを指定するための、binmodeっていう関数が用意されています。 これは、バイナリファイルなんかを取り扱いたいときにお世話になる関数なんですが、第二引数としてディシプリン(DISCIPLINES)を取ることもできます。 単純に、ディシプリンを指定せずにbinmodeを用いた場合、そのファイルハンドルをバイナリファイルとして扱うことを指定します。 open( IN, '<', 'hoge' ); binmode( IN ); つまり、上のように指定することで、ファイルハンドルの操作に対して、Perlに下手な加工は行わせないということを宣言するわけです。 さて、ディシプリンにはファイルハンドルに対して、どのように文字を加工するかと
WSH で Perl を使えるようにできるらしい。 デフォルトはで、WSH には VBScript と JavaScript が使える。 WSH で Perl を使えるようにするには、ActivePerl をインストールすればいい。 そうすると、 pls という拡張子のファイルが WSH(Perl) のファイルと認識されてダブルクリックで実行できるようになる。 hello.pls #!/bin/perl -w our $WScript = $WScript; use strict; use warnings; $WScript->Echo("Hello World!"); 1行目のshebangは無くていい。 use strict; を使いたい場合は、use strict; よりも前の行で、our $WScript = $WScript; としないと変数が宣言されてないといわれてエラー。
2008年02月22日23:30 カテゴリLightweight Languages perl - モジュールと%INC うむむ、ちょっとload averageが高い日日が続いたせいか、久々に熱が。 こういう時にはこういうあまり心身を使わないネタを。 Perl モジュールのありかを調べる perlwhere - Tociyuki::Diary モジュールのパスをてっとり早く見つけるには、コア・モジュールの Module::Build::ModuleInfo が便利です。 Module::Buildがコア入りしたのは5.10からなので、他の方法を紹介しつつ、特殊変数%INCの紹介などを。 まず、モジュールのありかを手っ取り早く調べる方法としては、 % perldoc -ml が使える。PODが含まれてなくてもOK。 しかし、中級以上の perl monger を目指すのであれば、%INCの
前回の記事が期せずしてホッテントリ入りしたので,ちょっとマズいと思い。 前回の記事が難しいと思ったとしても,それは恥ずべきことではありません。 あくまで Perl の内部構造の話ですから*1。 ただ,Perl で文字列を扱う/文字コードを扱うのは難しい,と思われるのは本位ではないです。 というのは,本当は,難しく考えなくでも動くように作られてますから。 拙い表現なもので上から目線に感じられたらごめんなさい。 もうちょっと詳しく書きます。 Perl の文字列の扱いは,なるべく後方互換性を確保しながら,進化してきました。 そのため,いろいろな思想,組み方でも動くようにできています。たとえば 文字コード,何それ,気にしない すべてバイナリ列だとみなす(上とほぼ同じ意味ですが) 内部コーディングを EUC-JP octet stream にする 内部コーディングを UTF-8 octet stre
UTF8 フラグについてわかってるつもりだったんですが,utf8::is_utf8 considered harmful - Bulknews::Subtech - subtech を読んで混乱したので,自分なりにまとめてみました。間違いがありましたらご指摘よろしく。 まとめ スカラー変数の内部表象の状態を示すものとして UTF8 フラグというものがある スカラー変数は(リファレンス等は別として)下記のものを格納できる (A) 文字列(内部表象: UTF-8) (B) 文字列(内部表象: ISO-8859-1) (C) バイナリ列 純粋なバイナリストリーム(画像ファイル等)かもしれないし, UTF-8 octet stream かもしれないし, CP932 octet stream かもしれないし,etc, etc ... Perl は(後方互換性確保などの理由から)ISO-8859-1
[@a]という構文が出てきてコレは何なのかamachangに聞いたらアレイのコピーなんだって。 $b = [@a];で@aがコピーされてそれへの参照が$bに入る。@$bと書いてデリファレンスしてやると同じ内容のアレイであることがわかる。 C:\>perl -e "@a = (1,2,3); $b = [@a]; print $b" ARRAY(0x1001345c) C:\>perl -e "@a = (1,2,3); $b = [@a]; print @$b" 123一方 $b = \@a;ならば参照のコピーなのでaを書き換えるとbも変わる。あれ、変わってない…。 C:\>perl -e "@a = (1,2,3); $b = \@a; $a->[1] = 5; print @$b" 123 - 解答篇 @aは参照ではなくアレイの実体なので$a->[1]=5;ではなく$a[1]=5;でな
「ウェブリブログ」は 2023年1月31日 をもちましてサービス提供を終了いたしました。 2004年3月のサービス開始より19年近くもの間、沢山の皆さまにご愛用いただきましたことを心よりお礼申し上げます。今後とも、BIGLOBEをご愛顧賜りますよう、よろしくお願い申し上げます。 ※引っ越し先ブログへのリダイレクトサービスは2024年1月31日で終了いたしました。 BIGLOBEのサービス一覧
昨日、ご紹介したスクリプトの中に以下があったと思います。 1 while $wk =~ s/\([^()]*\)//g; # 関数系を弾くこれは、SQLのSelect文の選択項目のところに以下のような関数が使用された場合、それ弾いています。 select MAX(ISNULL(aa,'0')) AS bb from aabb_tbl 「1 while s///」の説明は、以下にありました。 ここで,「1 while s///」というのは,「while (s///) {1}」と書くのと等しいです。 置換(s///)は成功すれば置換した数(この場合1)を,失敗すれば0を返すので,上の例では置換が成功する限り{ }の中の「1」を実行し続けます。実際には「1」は実行しても何も起こりません。 なので,「1 while s///」は置換ができる限りはそれを続け,置換ができなくなればそれで終了する,とい
Perl では Unicode のファイルを読み込んでも自動的にBOMを削ってくれない。過去に自分でも削ってくれるプログラムも書いた。 (「Perl 5.8.x で BOM を扱う」を参照) 最近、File::BOM というモジュールをCPANで発見した。いつのまにか、ActiveState のPPMのサイトにもアップロードされていた(つまり、バンドルされていないが、CPAN File::BOM で ActivePerl 5.10.0なら ppm install File::BOM とかでインストールできるということ)。 何通りかの使い方がある。ファイルを読み込んだとき、Encoding を知りたいのであれば、bom_open 関数が使える。 ちなみにこんな感じになる。 use utf8; use open ":encoding(cp932)",":std"; use File::BOM
Perl › モジュール › here Data::Dumperモジュールを使うと、ハッシュや配列などの変数の内容を見やすい形で出力することができます。またリファレンスを使用した複雑なデータ構造を見やすく出力することができます。 use Data::Dumper; # データをダンプ my $dump_string = Dumper $data; Dumper関数を使用するとデータを見やすい文字列に変換することができます。Dumper関数は出力を行わないことに注意してください。 画面に出力に出力したい場合は、print関数やwarn関数と組み合わせます。 print Dumper $data; warn Dumper $data; Data::Dumperのいくつかの例を紹介します。 スカラ変数を出力 スカラ変数を出力します。 my $name = 'kimoto'; print Dump
意外と知られてないかと思ったのでメモ。 grep {$_} map { $_ ? $N/$_ : undef } @_; って書くの? mapで特定要素を除外したいときとか - ロックスターになりたい mapを使って特定の要素を除去する方法ですが、上記の方法はこの用途であれば問題ないですが、undefという要素もちゃんと要素として見なしたい場合には困ります。 で、どうするかというと、mapの戻り値に空リストを返すことで要素の除去ができます。 my $n = 1000; my @array = (2, 1, 0, -1, -2); my @new_array = map { $_ ? $n/$_ : () } @array; たまーに使うので覚えておくと吉です。
perldoc の Encode::JP を読むと、Shift JISには3種類ある。 shiftjis - MS KanjiCP932 - CODE PAGE 932 = Shift JIS + MS/IBM vendor mappingsMacJapanese - Shift JIS + Apple vendor mappings うっすらとわかっているけれど、気持ち悪いので調べてみた。 Wikipedia に詳しい解説があった。 shiftjis - http://ja.wikipedia.org/wiki/Shift_JISCP932 - http://ja.wikipedia.org/wiki/CP932MacJapanese - http://ja.wikipedia.org/wiki/MacJapanese この3つの encoding について具体的に把握する方法を考えてみ
宣伝と注意書き このサイトが元になったCPANモジュールガイドという本を書きました。 本書でもとりあげています。 このページの最後で扱っている$Data::Dumper::Deparseには限界があるのですが、コードリファレンスを含むようなDumper結果を得たい(より再現性の高いシリアライズ)場合に使えるモジュールとしてData::Dump::Streamerの使い方も扱いました。 2008-01-31 use Data::Dumper; 今回は基本に立ち返り、Data::Dumper です。すでに説明なく何度も使ってる気もしますが、取り上げておくことに意味があると思うので、やります。 Data::Dumper はある変数のデータ構造を Perl のシンタックスで表現してくれるもので、デバッグ時など普通によく使います。Ruby の p() や .inspect()、JavaScript(
Perl 5.8.X 以降で、プログラムの先頭で use encoding 'shiftjis'; と宣言すると… 標準入出力(STDIN, STDOUT)が :encoding(shiftjis)になる ソースファイル中の文字列が実行前に UTF-8に変換される ここまでは perldoc encoding とするとEUC-JPを例に英語で解説されている。 次のプログラムをテキストエディタで入力してShift-JISコードで保存して実行してみるとわかりやすい。 use encoding "shiftjis"; use Data::Dump qw/dump/; print "1:","\x{8868}","\n"; print "2:","\x95\x5C","\n"; print "3:",dump("表"),"\n"; 実行すると次のような結果になる。 1:表 2:表 3:"\x{88
わりとよく使っているらしいWindows 環境 のjperl(ActivePerl 5.005へのパッチか?) のプログラムが動かないといわれたので、ActivePerl 5.8.X で動くように修正した。 プログラムの内容はShift-JISのテキストファイルを特定の形式に変更するもの。プログラムの内容はできるだけ修正したくないので、ソースファイルを UTF-8 に変更しプログラムの先頭に次の行を追加した。 use utf8; use open IO => ":encoding(cp932)", ":std"; つまり、1行めでソースコードは utf8であることを明示。2行目で機種依存コードを含む Shift-JISコードファイルの入出力を行い、ついでに標準入出力も Shift-JISに設定したということ。 これで処理すべきファイル8個のファイルのうち7個までは正常に処理できた。 異常の
use utf8している時のlengthは文字数を数えてしまうけど、それ以外のときは、バイト数を数えるそうだ。ところで、以下のようにしたらutf8のバイト数が取れるんじゃないかと思うんだけど、あまりutf8文字列のバイト数に需要がないのか、ググっても例が出てこない。 何か見おとしているのかもしれないな。 use utf8; my $bytes = length unpack('a*',$utf8_str); use utf8での文字列のバイト数 これ、僕も昔取得方法わかんなくて困ったことがある。 ってことで啓蒙活動しとく。 bytes::lengthを使います。 use utf8; require bytes; my $bytes = bytes::length $utf8_str; 「require bytes」が大事ね「require bytes」が。もし「use bytes」しちゃっ
http://d.hatena.ne.jp/kazukichop/20080124/1201146190 Perl分かってない - Lism.in * blog - nekoya (id:studio-m) あんまり元記事とカンケイなかったりするけど、一応。 print join "\n" , map { s/a/A/g; $_ } @list; この書き方は@listを破壊してしまう。 無論、破壊されても構わない場合はこれでもいいが、mapを使っているということは基本的には破壊されたくないはずだ。(でしょでしょ?) 破壊させる目的ならば個人的にはforeachを使う方がいいと思ってる。 s/a/A/g foreach @list; print join "\n" , @list; ま、それでもmapを使って値を変更しつつ@listを破壊したくないのであれば print join "\n"
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く