« 2009年05月 | メイン | 2009年07月 »

2009年06月30日

pearのクラスをインストール

MacOSXにPEARを入れたので、次はそれを利用してクラスをインストールします。
今回はPHPでフォームを作ろうとしているので、それに関連したものを入れる。

・HTML_QuickForm
PEARのHTML_QuickFormパッケージを入れると、フォーム入力処理が楽になるらしいです。
HTML_QuickFormはHTML_Commonも必要とするらしいので、両方をインストール。
$ sudo pear install HTML_Commom
$ sudo pear install HTML_QuickForm
今回入ったバージョンは、HTML_Common1.2.5とHTML_QuickForm3.2.11。

・Auth
PEAR::Authは、フォームにおいてユーザー認証を行うための便利な機能を提供してくれるらしいです。
$ sudo pear install Auth
今回入ったバージョンは、Auth1.6.1。

・Pager
PEAR::Pagerは、多くの情報がある場合にページを自動的に分割表示する機能を提供してくれるらしいです。
$ sudo pear install Pager
今回入ったバージョンは、Pager2.4.5。


最後にインストール済みクラスの確認
上で入れたものがちゃんと入っているか確認してみる。
$ pear list
これできちんと表示されてたらOK。

2009年06月29日

MacOSXにPEARをインストール

perlじゃないよ、pearだよ。

PEARはPHPのパッケージ管理ツールだそう。
PerlでいうところのCPANか。

参考にしてるところがログインシステムを組む上でPEARを使うみたいなので
私もインストールしておく。CPANみたいなのだったら便利だしね。

以下参考サイト
Mac OS Xで動かす軽量プログラミング言語@IT
Leopardにpearをインストール&設定@tonbyブログ

基本的にTonbyブログさんとこに習ってインストールしました。
けど、最後のpearの確認とこでコケて、
$ pear config-show
-bash: pear: command not found
というパスが通ってないときのエラーが出てしまう。
何だよう、Tonbyブログさんとこ見ながら.bash_profileにパス入れたじゃんようと思ったら、
どうやら.bash_profileを反映させてなかったかららしく、
$ source ~/.bash_profile
と打って、変更した内容を反映させたら無事動きました。ちゃんちゃん。

今日はなんだか体調が優れないので、手順のメモが手抜き。。

2009年06月25日

PHPとMySQLの連携

前回、これからはPHPとMySQLを使います宣言をしたので、
今週はPHPからMySQLへと接続するためのコードを書いていました。

初めてMySQLを使うということで初期設定やらSQL文の使い方やらを
書籍やネットを参考にいじってたんですが、データベース楽しいですねー。

とりあえず、
PHPからMySQLへの接続はOK。
PHPからMySQLへのデータ挿入もOK。
PHPからMySQLのデータ参照もOK。
PHPからMySQLのデータ検索もOK。

今はメールアドレスとパスワードが一致したらその旨を、
一致しなかったらその旨を表示するものを書いています。

そんなところですね。このまま先に進みますー。

2009年06月22日

MacでPHPからMySQLに接続するときの設定方法

MySQLでの超根本的な使い方を知った所で、PHPから接続してみる。

conect_mysql.php
<?php
$s=mysql_connect("localhost","root","password") or die("接続失敗...");
print "接続できました!";
mysql_close($s);
?>

このコードでPHPから接続できるようになっているはず。
しかし、これを見える所に置いて、ブラウザでアクセスするとエラーになる。
Can't connect to local MySQL server through socket '/var/mysql/mysql.sock'
はて?確かにvar/mysqlの中にはmysql.sockなんてファイルは無い。
(MySQLでは、ソケットを通じてサーバとクライアントが接続されるとのこと。)

ちょっと確認してみよう。
$ mysqladmin -u root -p version
-----
Server version		5.1.35-log
Protocol version	10
Connection		Localhost via UNIX socket
UNIX socket		/tmp/mysql.sock
Uptime:			23 min 30 sec
ってことで、正しいソケットはtmpフォルダの中にあるようです。
このソケットのパスが正しくないから、接続されてないんですね。

てなわけで、PHPからMySQLに接続されるように正しく設定することが必要。

MacOSでも、PHPの動作を指定させるためにphp.ini というファイルを作ってやらなければならない。
MacOSでは、etcディレクトリにphp.ini.defaultがサンプルで用意されているので、それを利用する。
sudo cp /etc/php.ini.default /etc/php.ini
sudo vi /etc/php.ini
php.iniの中から、下のそれぞれの行を探して、正しいパスを書いてやる。
[MySQL]
mysql.default_socket = /tmp/mysql.sock
[MySQLi]
mysqli.default_socket = /tmp/mysql.sock
で、Apacheを再起動する。
sudo apachectl restart #apacheの再起動

そしてもう一度ブラウザに行って再読み込みすると、見事「接続できました」の文字が。
やったね。

2009年06月21日

MySQLを使ってみる(その2)

データベースやテーブルの作り方、データの挿入は前回のエントリーで理解した。
今度はその作ったものを修正したり削除したりしたいときの話。

前回practiceデータベースのtable1という名前のテーブルを作ったので、これを更にいじる。

▼カラムの追加
id,name,artistというカラムに、ageカラムをINT型で追加してみる。
mysql> USE practice;
mysql> ALTER TABLE table1 ADD age INT;
追加したら、早速確認してみる。
mysql> DESC table1;

▼カラムの位置を変更
上でageが最後尾に追加された訳ですが、id,name,age,artistの順番に修正したい。
そんなときは、以下のように入力。し、確認してみる。
mysql> ALTER TABLE table1 MODIFY age INT AFTER id;
mysql> DESC table1;
カラムを先頭に持っていきたいときは、「AFTER 〜」の所を「FIRST」にしてやればOK。

因みに、最初から位置を指定してカラムを追加することも可能。
mysql> ALTER TABLE table1 ADD age INT AFTER name;

▼カラムを削除
やっぱり好きなアーティストカラムとかいらない。そんな時は。
mysql> ALTER TABLE table1 DROP artist;

▼テーブルを削除
いやむしろテーブルごといらない。そんな時は。
mysql> DROP TABLE table1;

▼データベースを削除
どうしてpracticeなんてデータベース作っちゃったんだろう…。そんな時は。
mysql> DROP DATABASE practice;


2009年06月19日

MySQLを使ってみる(その1)

無事にインストールと文字コード設定ができたということで、今週はMySQL強化週間!
0から始めて、まぁ簡単にどんなもんかは分かったよと言えるとこまでもってきたい。
とりあえず、
$ mysql -u root -p
でパスワードを打って、MySQLに入りましょ。

▼データベースの作成
まずは「practice」という名前のデータベースを作成してみる。
使うSQLコマンドは「CREATE DATABASE」。SQLコマンドは大文字・小文字は区別無し。
コマンドの最後には必ず「;」(「¥g」でも可)を付けることを忘れないように。
mysql> CREATE DATABASE practice;
「Query OK」と出ればコマンドが成功しています。
そしたら作ったデータベースを確認してみよー。
mysql> SHOW DATABASES;
実行すると、表みたいなのが出てきて、ちゃんと「practice」が作成されてる。
他にも「information_schema」とか「mysql」とか「test」とかあるけど、作った覚えが無いから
きっとデフォルトで作成されてるデータベースなんでしょうねー。
(※追記:「test」は空の、「mysql」はユーザー情報とかのMySQL自身についてのデータベースだそう。)

▼テーブルの作成
では、今度は「practice」データベースを色々いじってみよう。
とりあえず、これから使いますよ宣言は必須とのこと。
mysql> USE practice;
MySQLが「database changed」と応えてきたらOK。何も変えてないんだけどw

では、テーブルを作りましょう。
テーブルってなんじゃ?と思ったけど、Excelでいうシートみたいなもんらしい。
で更に、レコードは行(横軸)、カラムは列(縦軸)のことを言うらしい。ふむふむ。

データベースを作成するときは、初めにどんな項目を設けるかを考えなくてはならない。
じゃあ今回は…、そうだな、idと名前と好きなアーティストってことで作ってみます。
項目が決まったら、次はそれぞれの項目型をとサイズも考えてやらなきゃいけない。
型は今回は「VARCHAR:文字列」と「INT:整数」を使う。
サイズは、私のMySQLは5.1.35なので、文字数を表すそうです。(4.0まではバイト数だったらしい)
今回は、idを数字2文字、名前を文字列20文字、アーティストを文字列30字でいきます。

では、テーブルを作ってみる。名前は「table1」で。
mysql> CREATE TABLE table1(id INT, name VARCHAR(20), artist VARCHAR(30));
「Query OK」って出てきたら、テーブルを確認してみる!
mysql> DESC table1;
きちんとtable1が作成されてたらOK。

▼データの入力
次はデータの入力。
 01,佐藤,サザンオールスターズ
 02,鈴木,福山雅治
 03,高橋,Perfume
とかで入力してみます。以下を入力。
mysql> INSERT INTO table1 VALUES ( '01', '佐藤', 'サザンオールスターズ' ) ,
( '02', '鈴木', '福山雅治' ) , ( '03', '高橋', 'Perfume' );
入力し終わったらデータを表示してみる。
アスタリスク(*)は全てのカラムを指す。
mysql> SELECT * FROM table1;


※追記
私の環境では、テーブルにデータを一度に沢山入れようとするとターミナルがバグったり、
何故か日本語が???(クエスチョンマークの羅列)になったりと動作が非常に不安定ですが、
データベースの中にはきちんと格納されているようです。
なんなんだ…。


MySQLの文字コード設定

文字コードはutf-8で色々作ってるので、MySQLでもutf-8を使いたい。

まずは、デフォルトの文字コードを確認してみる。
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.1.35, for apple-darwin9.5.0 (i386) using readline 5.1
…
Server characterset:	latin1
Db     characterset:	latin1
Client characterset:	latin1
Conn.  characterset:	latin1
…
--------------

latin1という文字コードの状態のようです。これをutf-8にしたい。
まずは、設定ファイルをmy.cnfという名前でコピーして、これを利用して設定する。
$ sudo cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
$ sudo vi /etc/my.cnf

my.cnfの変更内容は、以下のそれぞれのブロックに以下の行を追加で書き込む。
[client]
default-character-set = utf8

[mysqld]
default-character-set = utf8
skip-character-set-client-handshake

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

で、保存したらMySQLを再起動。
もう一度MySQLに接続し、statusコマンドを打ってutf-8になってればOK。
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.1.35, for apple-darwin9.5.0 (i386) using readline 5.1
…
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
…
--------------

2009年06月18日

長いトンネルを抜けると、、、

梅雨っすね。

■RSS関係
文部科学省のサイト取得で不可解な動作が。。。
HTMLソースには一つしかないデータが、Webスクレイピングすると二重に取得される。
謎だ。。。何でだろう?
そしてここでもメール本文をJIS変換すると文字化けする。全略プロフの方でも同様の問題が発生してます。
仕方ないからUTF-8のまま送信してますが…。いつか問題解決しないとな。

■インターフェース関係
・データベースについて
ログイン情報や欲しいニュースジャンルを管理するためのデータベースを入れるにあたり、
色々種類があるのでどれを使うかの検討が必要。
POPFileはSQLiteまたはMySQLのサポートが充実してるので、どっちかを使った方が現実的。
(他のデータベースも使えるらしいけれど、ドキュメントが充実していないので…)
結局、MySQLの方がメジャーでドキュメントが充実しているので、こっちを使う方向で。
MySQLのインストールや初期設定は完了済み。

・WebUIの言語は何を使おうか
WebUIを作るにあたっては、Perl(CGI)もPHPもそれ程大差は無いみたい。
しかし、PHPはWebに特化してる言語でデータベースとの連携が楽みたいなので、PHPで構築することにします。
因みに、テストで簡易ユーザー登録を作ってみました。
今はtxtファイルにログを取っていますが、これをデータベースで実現するのが目の前の目標。
ただ、PHP+MySQLは情報がWebにゴロゴロ転がっているので、そんなに苦労はしなさそうです。と、祈りたい。

・UIはむしろメールでやってしまうのもアリ!
HTMLメールを使って利用者の設定をやってしまうのはどうかという先生のアイディア。
送信したURL先に利用者が飛んだかどうかをクエリーを用いてフィードバックが得られる。
とりあえずはWebUIを用いて構築してみるけど、こっちはこっちで便利なので、
アイディアを忘れないうちにメモしておきます。

2009年06月15日

漸くMySQLのインストール

MacbookにMySQLをインストール時の備忘録。その2。
結論から言うと、MacPortsを使わず、インストールパッケージを使って入れました。

因みに環境は以下。
Apache/2.2.11 (Unix)
PHP 5.2.8
MySQL 5.1.35
インストール環境も整ったので、早速開始。

今回はMacPortsを利用してインストールする。⇒エラーが起きて失敗。
参考にしたサイトは、BONNOH FRACTION 13さんのMacPortsでMySQLをインストール
+serverを付けることによって、自動起動用の設定ファイルも一緒にインストールされるそう。
$ sudo port -uv install mysql5 +server
で、次に初期データベースをインストールするコマンドを打つ、とあるんですが。
$ sudo -u mysql mysql_install_db5
しかし、ここでヘクる。次のエラーが起きてストップしてしまう。
WARNING: The host ' *** ' could not be looked up with resolveip.

ぐぐってみても、これといった対処法が見つからず。
仕方ないからMacpotsは次の機会に利用することにして、今回は断念。

で、MacOS Xでサーバー稼業さんのMac OS XにMySQLをインストールしようさんところを見つつ。
インストール自体は超簡単。

▼初期設定
インストール直後、全ての操作を実行出来るrootがパスワードなしで登録されてしまっているため、
だれでも rootとして接続でき、すべての権限を得られるそうです。これは危ない。
という訳で、rootにパスワードを設定します。
$ sudo ./bin/mysqladmin -u root password '設定したいパス'

▼接続してみよう
ここで、mysqlに接続してみる。
$ mysql -u root -p
しかし、以下のエラーが出てしまった。
-bash: mysql: command not found
どうやらパスが通ってない模様です。通してあげよう。
$ export PATH=$PATH:/usr/local/mysql/bin
で、もっかい接続のコマンドを打つ。するとパスワードを要求されて接続できた!
cm-ml01:~ name$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 54
Server version: 5.1.35 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

因みにインストールしたMySQLのバージョン確認は、
$ mysqladmin version
と打ってやれば把握することができます。

NEXT:MySQLで日本語を扱う人は、文字コードの設定は必須


※ 追記
上のやり方でパスを通すと、MySQLに接続するごとにパスを通すコマンドを打たなければならない。
これでは面倒なので、何か方法はないかと探したら、minorio のプログラミング・メモさんとこに書いてあった!
自分のホームディレクトリの~/.bashrcと~/.bash_profileに書き加えるんですねー。
そんなファイル自分とこには無いよ!って人は、作ること
▼.bashrc
alias mysql=/usr/local/mysql/bin/mysql
alias mysqladmin=/usr/local/mysql/bin/mysqladmin
▼.bash_profile
PATH=/usr/local/mysql/bin:$PATH
export PATH
これで、接続コマンドを打つだけでMySQLに入れます。やった!

2009年06月14日

MySQLインストール、の前準備

MacbookにMySQLをインストール時の備忘録その1。(その2はここ

早速インストール開始。…と、その前に。

MacPortsインストール編
MySQLを入れる方法はいくつかあるみたいだけど、
とりあえずMacportsとやらが色々便利そうなのでこれを機にインストールしとく。
参考にしたのは、MacBookにMacPortsをインストール@Get crazyさん。多謝。
私は、MacPorts-1.7.1-10.5-Leopard.dmgをインストール。

自分のところには.bashrcが無い。ので作る。Leopardだと、.bash_profileも必要だそうなので、作る。
自分のホームディレクトリにね。
$ touch ~/.bashrc
$ touch ~/.bash_profile

で、それぞれに以下を書き込む。※ちゃんとvi使いましたよ笑

▼.bashrc
export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
export MANPATH=/opt/local/man:$MANPATH
▼.bash_profile
source .bashrc

Get crazyさんとこの説明で、最初は一応読み込んどいてという指示があったので打つ。
$source ~/.bashrc
バージョン確認のコマンドを打って、結果が出ればちゃんとパスは通っている。
$ sudo port version
Password:
Version: 1.710



以下MacPorts使い方編
今後、MacPortsを利用してインストールできるかを調べるときは、以下のように。
$ port search ソフト名
で、MacPortsを利用してインストールするときは、以下のように。
$ sudo port install ソフト名
ソフトウェア一覧の更新は、以下のように。
これをやらないと古いバージョンがダウンロードされる恐れがあるため?定期的にやるとよい。
$ sudo port sync


その他、アンインストールやアップグレードなどインストール済みソフトの確認などについては、
はこべにっき#さんがまとめてくれているので、そっちを参考のこと!
2009年06月12日

朝日新聞がTwitterを始めた件。

朝日新聞が速報やニュースをつぶやくらしい。

しかも、新着タイトルとURLだけの自動ポストかと思いきや、人力だった!
つぶやく内容が、何かすんごい人肌な印象を受ける。笑
http://twitter.com/asahi

そういえば前にTwitterのアカウント取ったけど、
ハマる前にやらなくなっちゃったなぁ。
面白そうっちゃ面白そうなんだけど…buzztterとかね。
如何せん飽きやすく面倒くさがりなものでorz

どっちかっていうとTumblrの方が好き。
やっぱり画がある方が興味ひくよね。何かセンスあるように見えるし。笑
でも著作権とか考えると結構グレーなサイトなのかな。
http://www.tumblr.com/

2009年06月11日

safari4 がついに正式リリースされましたねー

safari4(β)を使ってみたいがために、
「不具合が多いから気をつけろ!」と悪評高い笑、MacOS10.5.7にアップデートしたわけですが、
その前に一応バックアップ取ったりだとか、報告通りインストール後の再起動でブルー画面でフリーズしたとか、
その他で自分の環境ではおかしい点が無いか調べたりだとか、何か大丈夫そうで安心したーとか、
そういうことをやってるうちにsafari4のことをすっかり忘れてたw

そんなんですっかり忘れてるうちに、遂に正式にリリースされたようで。
今日みんなのソフトウェアアップデートがぴょこぴょこしてたから、なんか出たのかと思ったら。
で、さっそくインストールしてみました。

↑ 起動するとTOP SITESというこんな画面がお出まし。
ユーザーがよく使うウェブサイトをCover Flowっぽく表示してくれるんですねー。かっこいい。
更新を☆で表示して教えてくれたりと便利みたいですよ。


この赤で囲ったところの、右側のやつを押せば、いつでもこのTOP SITESに戻れるみたい。


左側の本が開いたみたいなやつは、ブックマークをCover Flowで見せてくれるボタン。

何か普段safariを使ってない事がバレバレのスクリーンショットだなあ。
本当は辞書機能(ブラウザの語句の上で[ Cmd + Ctr + D ]を叩くと辞書アプリ起動)とか、
便利なことも多いんですけどね。
結局カスタマイズできるFireFoxにいっちゃうんだよなー。

でもWeb制作のときは便利かもしれない。
 safari>環境設定>詳細タブ>メニューバーに開発メニューを表示
にチェックを入れることで、
ユーザーエージェントでブラウザのバージョンごとにスタイルの崩れがチェックできたりとか、
Webインスペクタでページの構成を見れたりとか、他にも色々できるみたいなので、
これは結構使えるなあと思ってました。

どうですかね??

[perl] UNIX 改行コード値、スペースコード値

いっつも忘れて調べるので、備忘録。
ohzakiさんのPerlメモにはお世話になっています。多謝。
# 改行
$kaigyou =  '\x0A';

# 半角スペース
$space = '\x20';

# 全角スペース
$Zspace = '(?:\xA1\xA1)'; # EUC-JP
$Zspace_sjis = '(?:\x81\x40)'; # SJIS


2009年06月10日

[Perl] 波ダッシュ、全角ダッシュ問題

波ダッシュをJIS変換すると、\x{ff5e}という文字化けが起こる件について。

詳しくは、
> sasata299's blogさんの「perlの波ダッシュの文字コード変換のまとめ
にまとめられてあります。

これを参考に
$_ =~ tr/\x{ff5e}\x{ff0d}/\x{301c}\x{2212}/;
と一行コードを足したんですが、実行した際に
Bareword found 云々…
というエラーが起こる。

結局、trを使わず、sを使って置換した。
$_ =~ s/\x{ff5e}/\x{301c}/g;
$_ =~ s/\x{ff0d}/\x{2212}/g;
まぁうまく効いてるからいいけど、なんでtrだとBarewordになるんだろう??

地道な作業を続けていく事1週間。。。

今週は、細かい事をコツコツ修正していきました。

学校裏サイト
新規スレッドにも対応した自動取得。
これで、URLやソースの形が大幅に変更されない限り、
半永久的に書き込みを取得し続けることができます。

新聞
波ダッシュ問題の解決

教育関係ウェブサイト
「文部科学省」「学びの場」の新着情報を取得。
「宮城県教育委員会」「仙台市教育委員会」はソースの影響か、スクレイピングできません。
もう少し解析してみるか、もしくは正規表現でガツガツ取得するか…。むむ。

そろそろUIの方にも取りかかりたいので、
一旦こっちは休憩しようかな、と考えていますが、如何でしょう?

2009年06月07日

oNLINE生き物アルバム?

これは良いサイトw

いきものみっけ
http://www.mikke.go.jp/

2009年06月04日

文字化けと戦う!

もー!どんだけ文字コード周りで足止めを食っているんだか…
今週はバグとの戦い強化週間でした。

▼雑誌まわり
まず、前回の「本日発売の雑誌」データを取得したところ文字化け発生ということで、
今週はそれを直すことに集中していました。
かなり苦戦したんですが、とりあえず文字化け無しでメール配送まではこぎつけた!
未だにUTF-8フラグの意味が完全に理解しておらず、
多重変換orデコード忘れ?による「wide character in ...」エラーは多発していますが…。

具体的な解決した問題や暫定的な問題としては、
■S-JISとUTF-8が混在していたファイル処理を、UTF-8に統一。
■改行の無い長い文章だと途中から文字化けが起こる。
 ⇒とりあえず、$_=~ s/。/。¥n/g; で逃げてる状態。
  今後はUnicode::Japanese実装?これを使うと半角カナや絵文字などにも対応する?
■Jcode.pmを使うのをやめて、文字コード変換はEncode.pmで統一。
 ⇒ほとんど終了。メール送信時のJIS変換だけまだ解決していません。
■utf8→jis変換時の、いわゆる「波ダッシュ問題」
 ⇒以前、制御コード?と思っていた問題は、「〜」の文字化けでした。
  ここに問題がまとめてある。ここも参考になりそう。

▼学校裏サイト周り
前回、agejapanをwatchしているという話をしましたが、
agejapanのスレッドは90レスを超えると書き込めなくなる仕様のようです。
今はスレッドごとにwatchしているので、90を超えて次のスレッドに移った場合は
新しくコードを書きなおさなければなりません。
なのでそれだと面倒なので、TOPページをwatchして自動的に新しいスレッドが立ったら、
自動的に取得するようにコードを組み直したいと思っています。

▼教育関係Website周り

あとは教育関係Websiteですね。県教育委員会とか。
その辺で有名なwebページは以前まとめてあるので、そこを至急実装したいです。

予定が押していてやばい!文字コードの足止めが痛いなあ。

2009年06月03日

Perl5.8のUTF8まわりに関するメモ

文字化けの悩みがいつまで経っても払拭しないので、これを機に軽く勉強兼整理。

▼Jcode?Encode?@Jcode.pm - jcode.pl の後継、Encode.pm への架け橋
Perl 5.8.0 より、Jcodeの全機能は Encode module を通じてPerlに標準装備となります。
Jcodeのメンテナンスは旧Perlのために今後も続けていく所存ですが、
最新のPerlをお使いの方には、より高機能、高性能、そしてなんといっても標準装備の Encode の方をお薦めします。

▼UTF-8フラグ?
・utf8を含むスクリプトを書く際には、use utf8;(utf8で記述されていることを宣言)
 ⇒Unicode はマルチバイトだが、そのマルチバイト文字を「文字単位」で扱えるようになる。
  例えば、utf8フラグ下では「こんにちは」のlengthを取ると、「5」という結果になる。

▼エンコードとデコードPerl MEMO
UTF8フラグつきが基準となるので、 UTF8フラグが付いていない他形式への変換がencode、その逆がdecode。
・内部表現(UTF8フラグつきの文字列)から、指定した文字コードに変換する(UTF8フラグは落ちる)。
use Encode;
my $octets = Encode::encode($charset, $inner_str);
・指定した文字コードから、内部表現(UTF8フラグつきの文字列)に変換する。
use Encode;
my $inner_str = Encode::decode($charset, $octets);

▼ファイルの入出力
まずは読み込みについて。@Perl 5.8でUTF-8の文字コードを扱う
・読み込むファイルがUTF-8で書かれている場合のopen文は、
open(FH, "<:utf8", 'filename.txt');
・読み込むファイルがUTF-8以外のコードで書かれている場合は、encodingを用いる
open(FH, "<:encoding(shiftjis)", 'filename.txt');

次に入出力について。
Shift_JISファイルをEUC-JPに変換し保存する場合、Encode.pmを使うとこんな感じになる。
Perl 5.8.x における日本語コード変換のメモ
use Encode;

open (READ, '<:encoding(shiftjis)', 'sjis.txt');
 open (WRITE, '>:encoding(euc-jp)', 'euc.txt');
  while(my $data = ){
   print WRITE $data;
  }
 close (WRITE);
close (READ);

つまり、ファイルを開き読み込んだ時点で自動的にその文字コードから内部表現に変換され、
書き込む時点で内部表現から指定の文字コードへ変換されているのです。
従って、明示的に文字コードを示しておきさえすれば、手動で変換する必要は無いのです。
これを知らないで、手動で変換しようとする、つまり
open (READ, '<:encoding(shiftjis)', 'sjis.txt');
 open (WRITE, '>:encoding(euc-jp)', 'euc.txt');
  while(my $data = ){
   $data = encode('euc-jp', decode('shiftjis', $data));
   print WRITE $data;
  }
 close (WRITE);
close (READ);
のようにしてしまうと、多重の変換が行われて文字化けを起こしたり、
「Wide character in 云々」というエラーを吐いたりする。