[ubuntu-jp:1672] Re: a2ps perl 版について

"edry(えどりぃ)" go @ edry.jp
2009年 3月 20日 (金) 17:39:37 GMT


edry(えどりぃ)です。

a2ps.pl-1.45 が何をするものか詳しく知らないのでソース見ただけの話です。

perl のソース見ながら調べた結果ですが、デバッグ時の「-d2」というオプション
を使うときに影響があるだけなので、警告の出ている行をコメントアウトして問題無いです。


> $# is no longer supported at /usr/bin/a2psj line 195.
> とのエラーメッセージが出ます。 a2ps.pl-1.45 も同様です。Perl のバージョ
> ンが 5.10 系になったからとは考えにくいのですが皆さんは正常動作していらっ
> しゃいますでしょうか。

perl 5.10 で警告が出ている理由は「$#」という特殊変数を使用している為です。


perldelta - perl 5.10.0 の新機能
http://fleur.hio.jp/perldoc/mix/pod/perl5100delta.mix.html#The_$*_and_$#_variables_have_been_removed
────────────────────
$* 及び $# 変数は削除されました The $* and $# variables have been removed

/s 及び /m 正規表現修飾子が導入されたことで非推奨となっていた $* は削除されました.
 $*, which was deprecated in favor of the /s and /m regexp modifiers, has been removed.

非推奨となっていた $# 変数 (数値の出力形式)は削除されました. (編注: 配列の最後の添字を取得する $#VAR ではないです)
 The deprecated $# variable (output format for numbers) has been removed.

2つの厳しい警告, $#/$* is no longer supported が追加されました.
 Two new severe warnings, $#/$* is no longer supported, have been added. 
────────────────────

上記の通り「$#」は perl 5.10 では削除されており警告が出るようになっています。


この変数を使っている場面を調べてみました。

./a2ps.pl-1.45
────────────────────
   193	if ($debug == 2) {
   194	    require('dumpvar.pl');
   195	    local($#) = '%.6g';
   196	    &dumpvar('main',
   197		     'width', 'height', 'lmargin', 'smargin', 'font_size',
   198		     'sheet_height', 'sheet_width', 'char_width', 'skip_column',
   199		     'header', 'page_width', 'page_height', 'header_size',
   200		     'linesperpage', 'columnsperline');
   201	    exit(0);
   202	}
────────────────────

「$#」という特殊変数は出力時の数値形式を表すフォーマットのようです。

http://perldoc.jp/docs/perl/5.6.1/perlvar.pod
────────────────────
# $OFMT
# $#

数字を印字する際の出力フォーマット。この変数は、不十分ではありますが、
awk の変数 OFMT をエミュレートしようとするものです。しかしながら、
awk と Perl は異なる記法で数値を表わしています。
また、初期値は"%.ng" で、ここで n はシステムの float.h で定義されている
マクロ DBL_DIG の値です。これはawk のOFMT のデフォルト値である "%.6g" と
異なっていますので、 awk での値を得るには、明示的に $# を設定する必要があります。
 (記憶法: # は数値記号です。)

$# は古いものなので使わないようにしてください。
────────────────────


コードの引数を取る部分を見ると、「-d」がデバッグ用に出力する際に使われています。

./a2ps.pl-1.45
────────────────────
 96 while ($_ = $ARGV[0], s/^-(.+)$/$1/ && shift) {
    〜中略〜
111     if (s/^d(\d*)//)        {$debug=$1||1;              redo;}
    〜以下略〜
────────────────────

$debug が使われている部分を調べると、警告が出ていた193〜202行目と次の所がありました。

./a2ps.pl-1.45
────────────────────
576 sub print_template {
577     return if $debug;
    〜以下略〜
────────────────────




■まとめると。

perl 5.10 で削除されている「$#」という特殊変数を使っている為警告がでており、
a2ps.pl-1.45 を使用する際に「-d2」というオプションを付けた場合に影響します。

./a2ps.pl-1.45 -d2

これ以外に影響は無いので、
────────────────────
#    local($#) = '%.6g';
────────────────────
195行目の先頭に「#」を付けてコメントアウトしていいんじゃないでしょうか。
デバッグ用のものなので、普段使う分には影響はないです。



■「-d2」というオプションの出力内容も確認してみました。


○ perl 5.8.8 で「-d2」オプションを使ったときの出力を確認。

perl5.8.8 ./a2ps.pl-1.45 -d2 (195行目をコメントアウトする前)
────────────────────
$page_height = 694.08$columnsperline = 86$font_size = 6.6$header_size = 15.84$skip_column = 1$height = 11.64$sheet_width = 509.04$smargin = 1.2$page_width = 751.68$lmargin = 1.2$linesperpage = 66$sheet_height = 751.68$char_width = 3.96$header = 0.22
────────────────────
※なぜか改行がされない。

perl5.8.8 ./a2ps.pl-1.45 -d2 (195行目をコメントアウトした後)
────────────────────
$page_height = 694.08
$columnsperline = 86
$font_size = 6.6
$header_size = 15.84
$skip_column = 1
$height = 11.64
$sheet_width = 509.04
$smargin = 1.2
$page_width = 751.68
$lmargin = 1.2
$linesperpage = 66
$sheet_height = 751.68
$char_width = 3.96
$header = 0.22
────────────────────


○ perl 5.10.0 で「-d2」オプションを使ったときの出力を確認。

perl5.10.0 ./a2ps.pl-1.45 -d2 (195行目をコメントアウトする前)
────────────────────
$# is no longer supported at ./a2ps.pl-1.45 line 195.
$page_height = 694.08
$columnsperline = 86
$font_size = 6.6
$header_size = 15.84
$skip_column = 1
$height = 11.64
$sheet_width = 509.04
$smargin = 1.2
$page_width = 751.68
$lmargin = 1.2
$linesperpage = 66
$sheet_height = 751.68
$char_width = 3.96
$header = 0.22
────────────────────
※警告が出ている。

perl5.10.0 ./a2ps.pl-1.45 -d2 (195行目をコメントアウトした後)
────────────────────
$page_height = 694.08
$columnsperline = 86
$font_size = 6.6
$header_size = 15.84
$skip_column = 1
$height = 11.64
$sheet_width = 509.04
$smargin = 1.2
$page_width = 751.68
$lmargin = 1.2
$linesperpage = 66
$sheet_height = 751.68
$char_width = 3.96
$header = 0.22
────────────────────


上記の例だと違いが分からないですが195行目のフォーマットを指定していると、
「0.123456789」のような数値を
「0.123457」のように小数点以下を6桁までに丸めてくれます。

違いはこれくらいです。

以上



ubuntu-jp メーリングリストの案内