2009-09-29 2 views
19

List::MoreUtilsモジュールは、pairwise機能を持つBLOCKを提供するときに、変数$a$bを使用することを示します。たとえば、次のように

use strict; 
use warnings; 
use List::MoreUtils qw'pairwise'; 

my @x = (1 .. 5); 
my @y = (11 .. 15); 
my @sums = pairwise { $a + $b } @x, @y; 

しかし、私はそれを行うとき、私はこのような警告が表示されます:

 
Name "main::b" used only once: possible typo at try.pl line 7. 
Name "main::a" used only once: possible typo at try.pl line 7. 

この問題に対処するためのエレガントな方法はありますか?

更新:解決される問題:

のperl v5.19.6ためと超えanswer by Etherを参照してください。

+1

これはこれまで報告されていなかったので、私はちょうどhttps://rt.cpan.org/Ticket/Display.html?id=65629で行っています。 – Ether

答えて

23

あなたが優雅と考えるものによって異なります。

no warnings qw(once); 
our ($a, $b); 

これら2つのうちの1つで十分です。あなたはかなり簡単に範囲を制限することもできます。

my @sums = pairwise { no warnings qw(once); $a + $b } @x, @y; 
my @sums = pairwise { our $a + our $b } @x, @y; 

明示的にパッケージを指定すると、警告も抑制されます。あなたがmain

my @sums = pairwise { $::a + $::b } @x, @y; 
+0

この「警告なし」は必要ありません - 少なくとも最初の例では。 –

+2

そのコードに続く行を引用する場合は、「これらのうちの1つで十分です。」 –

+0

@Chris Lutz:申し訳ありませんが、私の誤解。 –

1

私が書いている同様のモジュールで同じ問題があります。 (もちろん、二回$a$bを使用する関数を使用するよりも、他の)私が見つけた唯一の解決策は、あなたのコードのどこかにこの行を置くことである:それは基本的に何もしません

$a = $b; # hack to disable warnings about "main::a" used only once 

が、それは警告を無効にし。将来のメンテナーがあなたの心を読む必要がないようにコメントを残すことを検討してください。

+0

あなたは '$ a = $ a' :) – pwes

+1

@pwes - いいえ。それはしばらくしていますが、IIRCは '$ a'と' $ b'の両方について警告します。 '$ a = $ b'は両方をきちんと使っているので、それぞれの警告を無効にします。どちらか一方の値が 'BEGIN'ブロックから残っている可能性はありますが、後のコード_could_はこの値に依存している可能性がありますが、その考えは私に悪夢を与えますが、' $ a = $ a; $ b = $ b;は技術的に優れているかもしれません。 –

+0

OK、ブロック内で使用するつもりだと思っていましたが、その場合は_does_ something :) – pwes

2

にしている場合は、あなたのプログラムのこの近くにトップを追加します。

use vars qw($a $b); 

か、あなたはperldoc varsの「時代遅れ」の部分が気に入らない場合は、単に追加:

our ($a, $b); 
+0

'' vars qw($ a $ b);を使って '' sort() ''を読んでいるところを覚えていますが、perldocで見つけることができません。だから、私の想像力のようなものかもしれません。 –

+3

'use vars'はパッケージスコープですが、' our'は格納ブロックに字句的にスコープされていますので、環境衛生の観点から私は 'our'を好んでいます... – ephemient

6

これはおそらくList::Utilのバグです。これだけのコードのその部分に関連する警告カテゴリをオフにします

{ 
    no warnings 'once'; 
    return join("_", @monsters) if @monsters && List::Util::reduce { $a && $b // 0 > 0 } 1,@monsters; 
} 

:グローバル警告をオフにする

は、しかし、あなたはこのような何かを行うことができ、おそらく良いアイデアではありません。

6

うん、それはあなたじゃない。あなたは一度も警告を出すことはできません。または、もう1回使用しないように$ aと$ bを事前に宣言することができます。

our ($a, $b); 

です。私はそれが他のもののための警告を止めないのでそれを好む傾向があり、それはもう少し説明的です。

4

perl 5.19以降。すべて$aおよび$bのすべての用途については、this warning is disabledです。

+0

Thanks、Ether。私は質問にも更新を追加しました。 – FMc

関連する問題