12月 07
Perlでエラーのお話。
“eq”は別の予約語の場合もあり。
例えば、
if( $temp eq 'asdf' ){}
という、何の変哲も無い比較を行うときに出現するエラー。
これを回避するには、
if( "$temp" eq 'asdf' ){}
とすればいいのだけれど、これは$tempが純粋なスカラーでない場合に発生する。
つまり、
print ref $temp;
この場合、リファレンスを調べるとSCALARではないとき。
自分がよく遭遇するのは、
XML::LibXML::NodeList
のとき。
スカラーが帰っていると思い込んでいると、たまに痛い目にあいます。
10月 20
URLエンコードとは「スペース以外を%HH形式に変換し、スペースを+に変換する」などの仕様については軽く流しておいて、実際にどう使うかメモしておく。ちなみにPHPではいつもアンダースコアを混ぜてしまいsyntax errorを出すのはお約束になっています。
PHPでURLエンコード
rawurlencode( $uri );
PHPでURLデコード
rawurldecode( $uri );
rawが付かないものは、いつかどこかで不具合を起こすかもしれないので、つけておいたほうが無難です。
そして、エンコードの結果は大文字になっているので、他のスクリプトと連携させるときには注意すること。
ローカルはWindowsで動いているのに、リモートにアップしたとたん大文字小文字の違いで動かなくなったりなどよくあること。
ちなみに、Perlでよく使われる以下のようなURLデコードは小文字に変換されます。
PerlでURLエンコード
sub url_encode( $ ){
my $str = shift;
$str =~ s/([^\w ])/'%'. unpack( 'H2', $1 )/eg;
$str =~ tr/ /+/;
return $str;
}
PerlでURLデコード
sub url_decode( $ ){
my $str = shift;
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack( 'H2', $1 )/eg;
return $str;
}
この場合に問題になるのはエンコードのほうで、デコードはほとんど関係有りません。エンコードで大文字にするか小文字にするかは、どちらかに決めておいたほうがいいかもしれませんが、ブラウザで表示されるのは一般的に大文字なので、PerlのURLエンコードにはuc()の追加をお勧めします。つまり次のようになります。
PerlでURLエンコード
sub url_encode( $ ){
my $str = shift;
$str =~ s/([^\w ])/'%'. uc( unpack( 'H2', $1 ) )/eg;
$str =~ tr/ /+/;
return $str;
}
間違えてはいけないのは、RFC1738には、大文字と小文字の両方が表記されており、「大文字で無ければならない」のではなく、「大文字の方が何かと都合がよい」ということです。PHPと連携させなければ特に考えなくてもいいです。
packはコピペが多く、それほど使いこなせているわけでもないので、他に方法がありそうな気もしますが、見慣れたコードに関数を追加するという明瞭な方法をとることも可読性という意味では大事でしょう。Perlに可読性を求めるなといわれそうですが。
10月 08
Excelのデータを読む必要が出てきました。
稼動しているシステムでは表向きはPHP、内部はほぼPerlという、
純粋なPHPプログラマにはお手上げのシステムです。
もちろん私はPerlerなので、痛くも痒くもありませんが。
さて、例によってPerlとPHPの間にゴングが鳴らされました。
Perlはお決まりのものがあるので置いといて、PHPのPEARでExcelを探してみると・・・
- Spreadsheet_Excel_Writer: Package for generating Excel spreadsheets
- Structures_DataGrid_DataSource_Excel: DataSource driver using Excel spreadsheets
- Structures_DataGrid_Renderer_XLS: Renderer driver using PEAR::Spreadsheet_Excel_Writer
この3つがヒットしました。
ちなみに、PECLには登録なしでした。
なんかいまいちっぽいので、PEARに登録の無いものを探してみることに。
PHPExcelなるものを発見しました。
このライブラリを取り上げているサイトは多いけど、
実際に使っていたり、サンプルコードを掲示しているサイトが一つも無い・・・
Documentを読んだ限りでは多機能だとわかりますが、
本当に動くかどうか検証されていないものをシステムに入れるわけには行きません。
やはり使い慣れたPerlモジュール「Spreadsheet::ParseExcel」の出番ですか・・・
9月 15
16進数を10進数に、
16進数を8進数に、
10進数を16進数に、
10進数を8進数に、
8進数を10進数に、
8進数を16進数に、
他にもいろいろありますが、コピペを使い続けてきたためか、いざ自前で式を書こうとすると全く書けません。
検索の仕方が悪いのかの、関数があるのを見落としているだけなのか、なかなか見つかりません。
PHPにはbase_convert()がありますが、使い勝手がよろしくない。
my $str = '本日は晴天なり';
my $buf = q{};
$buf .= sprintf( '\%o', $_ ) foreach unpack 'C*', $str;
う~ん、美しい。
9月 10
PerlでPOSTする必要があったので調べてみた。
HTTP::Request::CommonでPOSTするデータを用意して、LWP::UserAgentに委ねるだけ。
この連携はいつ使っても感動しますね。
use strict;
use LWP::UserAgent;
use HTTP::Request::Common;
# POST準備
my $url = 'http://exsample.com/receive.cgi';
my %postdata = ( 'id' => 'id', 'pass' => 'pass' );
my $request = POST( $url, \%postdata );
# 送信
my $ua = LWP::UserAgent -> new;
my $res = $ua -> request( $request ) -> as_string;
9月 07
PostScript::Simpleには楕円を描くためのメソッドは用意されていません。
そのため、自力で書く必要があります。
コツは楕円の中心へtranslateして、そこを中心にscaleします。
用意されているcircleメソッドで円を書いて、
scaleを元に戻して、translateも元に戻します。
これで元の座標軸に戻ります。
# 楕円のサイズ
my $width = 100;
my $height = 50;
# 横幅を基準に描画する
$ps -> {'pspages'} .= sprintf( "%d %d translate\n", $width, $height );
$ps -> {'pspages'} .= sprintf( "1 %.2f scale\n", $height / $width );
$ps -> circle( 0, 0, $width );
$ps -> {'pspages'} .= sprintf( "1 1 %.2f div scale\n", $height / $width );
$ps -> {'pspages'} .= sprintf( "-%d -%d translate\n", $width, $height );
movetoとの使い分けが難しいですね。
楕円のときだけtranslateなのかな?
9月 02
たまにド忘れするので、書くうちに覚えるだろうと。
my $num = 123456;
my $digit1 = $num – int( $num / 10 ) *10
9月 01
図形をrotate する場合は普通に左下が始点だけど、
annotateのパラメータとしてrotateを使う場合は、
左のベースラインが基準になるので、微妙な位置に描かれてしまう。
ベースラインは文字の高さの12.5%の位置。つまり72ptなら
72 * 0.125 = 9
左下から9ptの位置になる。
しかしここを基準に回転させるので実際には、
72 - 9 = 63
63pt分、上にシフトさせてやれば希望の位置に収まる。
8月 23
新しい環境を用意してます。
XML::Simpleはいつも怒られますね。
cpan> install XML::Simple
Running install for module XML::Simple
Running make for G/GR/GRANTM/XML-Simple-2.18.tar.gz
Is already unwrapped into directory /root/.cpan/build/XML-Simple-2.18
Makefile.PL returned status 65280
Running make test
Make had some problems, maybe interrupted? Won't test
Running make install
Make had some problems, maybe interrupted? Won't install
まぁ、よくわかんないので、yumのおまじないを唱えることにします。
perlのモジュール系でエラーが出たら、perl-[モジュール名]でインスコできることを最近知りました。
# yum install perl-XML-Simple
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
* base: ftp.nara.wide.ad.jp
* updates: ftp.nara.wide.ad.jp
* addons: ftp.nara.wide.ad.jp
* extras: ftp.nara.wide.ad.jp
base 100% |=========================| 1.1 kB 00:00
updates 100% |=========================| 951 B 00:00
addons 100% |=========================| 951 B 00:00
extras 100% |=========================| 1.1 kB 00:00
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package perl-XML-Simple.noarch 0:2.14-4.fc6 set to be updated
--> Processing Dependency: perl(XML::Parser) for package: perl-XML-Simple
--> Running transaction check
---> Package perl-XML-Parser.i386 0:2.34-6.1.2.2.1 set to be updated
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
perl-XML-Simple noarch 2.14-4.fc6 base 68 k
Installing for dependencies:
perl-XML-Parser i386 2.34-6.1.2.2.1 base 210 k
Transaction Summary
=============================================================================
Install 2 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 278 k
Is this ok [y/N]: y
Downloading Packages:
(1/2): perl-XML-Simple-2. 100% |=========================| 68 kB 00:00
(2/2): perl-XML-Parser-2. 100% |=========================| 210 kB 00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: perl-XML-Parser ######################### [1/2]
Installing: perl-XML-Simple ######################### [2/2]
Installed: perl-XML-Simple.noarch 0:2.14-4.fc6
Dependency Installed: perl-XML-Parser.i386 0:2.34-6.1.2.2.1
Complete!
わーい、わーい
8月 22
XML::Simpleが遅いというか重いというか。
調べてみるとXML::LibXMLが便利らしい。
それなら使ってみようかと調べてみるが・・・
XML系モジュールのベンチマーク盗用記事しか見つからない。
まともに使い方を説明しているところが無かったので、ソースを読む羽目になる。
とりあえず、WCGのデータからLastUpdatedを取得する方法
my $parser = XML::LibXML -> new();
my $dom = $parser -> parse_file( $set{'target'} );
my $lastUpdated = ( $dom -> getElementsByTagName( 'LastUpdated' ) )[0] -> findnodes( '.' );
しかし命名法則としてXML::LibXMLはいいのだろうか。
Recent Comments