CPAN の IO/Uncompress/RawInflate.pm でエラー

CPAN を更新しようとしたら次のようなエラーが出た。

# cpan
cpan> install CPAN
..中略..
can’t call method “value” on an undefined value at /usr/local/lib/perl5/5.8.8/IO/Uncompress/RawInflate.pm line 64.

どうも展開に失敗しているようで、パッケージのインストール、更新ができなくなってしまっていた。
調べたところ, perl 用の Raw-Zlib 圧縮ライブラリに問題があるようだったので

pkg_deinstall p5-Compress-Raw-Zlib bsdpan-Compress-Raw-Zlib

で削除し、その後通常通り cpan コマンドを走らせたところ無事動作しました(*)。
Ubuntu なら libcompress-raw-zlib-perl を削除すればいいとのこと。
 


(*)実際には

# pkg_deinstall p5-Compress-Raw-Zlib

だけでは途中でエラーになったため

pkg_deinstall bsdpan-Compress-Raw-Zlib bsdpan-Compress-Zlib bsdpan-IO-Compress-Zlib bsdpan-IO-Zlib

で関係ありそうな port をいったん全て削除しました。
参考:
yclog: Can’t call method “value” on an undefined value at /usr/share/perl5/IO/Uncompress/RawInflate.pm line 64

スクリプトを実行している perl の実行パスを調べる変数

print $0;

だと, スクリプト名になってしまうので

print $^X; # $ + 制御文字 0x18

とします。
 
例:
foo.pl

#!/usr/bin/perl
 
print “script name: $0\n”;
print “perl: $^X\n”;

実行コマンド:

./foo.pl

結果:

script name: ./foo.pl
perl: /usr/bin/perl

簡単に CRLF を LF に変換する(CRLF2LF)

次のように入力することで、sjis.txt の CR+LF を LF だけに変換し、out.txt として保存することができます。

$ cat sjis.txt | perl -pe ‘s/\r$//’ > out.txt

CGI やシェルスクリプトを、Windows などで書いた場合などは末尾に CR が入っていると, 一行目を正しく認識できないために “bad interpreter” と出るので、その対策によく使います。
 
追記:
(2006-08-08) /usr/games/fortune freebsd-tips で、次の方法も紹介されてました。

col -bx < dosfile > newfile

(2007-07-13) ↑の、col は日本語には対応していないようで、SJIS の日本語文字を含んでいると化けてしまいました。