Perlゼミ

  1. Perl
  2. 標準関数
  3. here

wantarray関数 - スカラかリストをコンテキストに応じて返却

Perlではコンテキストという概念があるので、スカラあるいはリストをコンテキストに応じて返却することができます。

sub func_name{
  # 処理 ...
  return wantarray ? リスト : スカラ;
}

wantarrayを使えば、リストコンテキストの場合とスカラコンテキストの場合を区別して、戻り値を返却することができます。

wantarrayが使われている標準関数にはlocaltime関数があります。

wantarray関数は使わないほうがよい

wantarray関数は、非常に発見しにくバグを生み出しだしがちなので、使用することはお勧めしません。たとえば、スカラが返ってくると思って、関数の引数に指定したら、リストが返っていたということが、起こりうるからです。

# スカラが返ってくると思っていたが、実際はリストが返ってきてしまう
func(localtime());

このようなバグを避けるためには、wantarray関数は使わずに、戻り値はスカラ変数を返すか、リストを返すようにしましょう。

サンプル

wantarrayのサンプルです。

use strict;
use warnings;

# スカラかリストをコンテキストに応じて返却する
# wantarray ? return リスト : return スカラ

print "1: スカラかリストをコンテキストに応じて返却する\n";
my @nums = (1, 2, 3, 4, 5);
my @odd_nums = grep_odd_nums(@nums);
my $odd_nums_cnt = grep_odd_nums(@nums); 

print "1~5 の中で、奇数は、", join(',', @odd_nums) . "です。\n";
print "奇数の個数は、$odd_nums_cnt です。\n\n";

# 奇数のリストを返却するサブルーチン
sub grep_odd_nums {
  my @nums = @_;
  my @odd_nums;
  
  for my $num (@nums) {
    if($num % 2 == 1) {
      push @odd_nums, $num;
    }
  }

  # リストコンテキストならば、 @odd_nums を返却
  # スカラコンテキストならば、 @odd_nums の個数を返却
  return wantarray ? @odd_nums : scalar @odd_nums;
}
Perlの書籍
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
    この私、Perlゼミの作者が執筆しています。
    ご購入、口コミ歓迎。
  • Perlの書籍 »
自己紹介
木本裕紀

「こっ、こしゃくな。
このPerオタクめ~!」

Twitter
フォロー、いいね、リツート、コメント歓迎

Youtube

チャンネル登録、いいね、コメント歓迎

kimoto.yuki@gmail.com
応援メッセージ、質問、間違い報告歓迎

木本システム株式会社
ご紹介キャンペーン実施中です。契約金額の10%をご紹介料としてお支払い。

(例)30万円のシステム開発委託契約が、1年続いたら、36万円がもらえる!!!