[Mew-dist 12573] Re: (mew-release) Mew 1.94.2 and IM 140
SAKAI Kiyotaka
ksakai at example.com
2000年 2月 28日 (月) 15:09:58 JST
>> In article <20000228.144140.71089030.sai at example.com>, SAITO Atsunori <sai at example.com> writes:
> 1.95bの途中からmewがSMTPを喋り始めたためimputを使っていなかっ
> たんですが、いましがたim-140を入れ、imput -qと打つと...
> % imput -q
> Too many arguments for IM::Smtp::smtp_transaction_for_error_notify at /usr/local/bin/imput line 1939, near "@Body)"
> Execution of /usr/local/bin/imput aborted due to compilation errors.
> と言われてしまいました。
> % diff -u imput.in.org imput.in
> --- imput.in.org Mon Feb 28 14:27:04 2000
> +++ imput.in Mon Feb 28 14:27:12 2000
> @@ -1936,7 +1936,7 @@
> push(@Smtp_servers, split(',', $Emg_Smtp_servers));
> for (my $i = 0; $i <= $#Smtp_servers; $i++) {
> - $rc = smtp_transaction_for_error_notify($Smtp_servers[$i],
> + $rc = &smtp_transaction_for_error_notify($Smtp_servers[$i],
> \@Smtp_servers, \@Header, \@Body);
> return 0 if ($rc == 0);
> 1行修正したら上記メッセージは出なくなりましたが、perlを良く
> 理解していないため、正しい修正か不明です。
まず、& を入れたときと入れないときの違いは man perlsub に以下ような説
明があります。
A subroutine may be called using the "&" prefix. The "&" is
optional in modern Perls, and so are the parentheses if the
subroutine has been predeclared. (Note, however, that the
"&" is NOT optional when you're just naming the subroutine,
such as when it's used as an argument to defined() or
undef(). Nor is it optional when you want to do an indirect
subroutine call with a subroutine name or reference using
the &$subref() or &{$subref}() constructs. See the perlref
manpage for more on that.)
Subroutines may be called recursively. If a subroutine is
called using the "&" form, the argument list is optional,
and if omitted, no @_ array is set up for the subroutine:
the @_ array at the time of the call is visible to
subroutine instead. This is an efficiency mechanism that
new users may wish to avoid.
&foo(1,2,3); # pass three arguments
foo(1,2,3); # the same
foo(); # pass a null list
&foo(); # the same
&foo; # foo() get current args, like foo(@_) !!
foo; # like foo() IFF sub foo predeclared, else "foo"
Not only does the "&" form make the argument list optional,
but it also disables any prototype checking on the arguments
you do provide. This is partly for historical reasons, and
partly for having a convenient way to cheat if you know what
you're doing. See the section on Prototypes below.
簡単にまとめると、特殊な用例を除くと、& を入れるのは prototype check
を省略する効果があるかどうかの違いだけということになります。
しかしこれは、IM では
use strict 'subs'
を使用して prototype check しているものを無効化しますので、個人的には
必要のない場面では入れない方が better だと思います。
次に、上のエラーに関して言うと、smtp_transaction_for_error_notify() は
IM 140 では引数 4つの関数で、該当行も引数を 4つ指定していますので、こ
のエラーが発生すること自体がおかしいです。
imput だけ新しくして、IM/Smtp.pm は古いバージョンのものを使用している
としか思えない現象なのですが…。
--
酒井 清隆 (E-mail: ksakai at example.com)
Mew-dist メーリングリストの案内