2007/01/10

functionもfilterも関数で、どっちもパイプラインからの入力を受け付けることができます。入力オブジェクトはfunctionの場合は$input、filterの場合は$_に格納されます。じゃあどう違うのか?というと、

・functionは入力オブジェクト配列を一度に処理する

・filterは入力オブジェクト配列を個別に処理する

という点です。次のコードを実行してみると違いがわかると思います。

function func1 
{
    $input
    "func1"
}
 
filter filter1
{
    $_
    "filter1"
}
 
 
1..5 | func1
""
1..5 | filter1

実行結果:

1
2
3
4
5
func1

1
filter1
2
filter1
3
filter1
4
filter1
5
filter1

$inputには入力されたオブジェクトがそのまま格納されているのに対し、$_には各要素が分解されてそれぞれ格納されていることがわかります。

ただ、少し謎なのがfunction内でbegin,process,endキーワードを使った場合です。次の例をご覧ください。

function func2
{
    begin 
    {
         "最初の1回呼ばれます"
    }
    process
    {
         "複数回呼ばれます  $input" 
    }
    end 
    {
         "最後の1回呼ばれます"
    }
}
 
1..5 | func2

これを実行すると次のようになります。

最初の1回呼ばれます
複数回呼ばれます  1
複数回呼ばれます  2
複数回呼ばれます  3
複数回呼ばれます  4
複数回呼ばれます  5
最後の1回呼ばれます

この場合、$inputは入力要素を分解したものが格納されていますよね。しかも、$inputを$_としても同じ結果になります。うーむ、じゃあfunction + process とfilterの違いは何でしょう?

元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/01/10/55277.aspx

古い記事へ | 新しい記事へ


プライバシーポリシー

Twitter

Books