プロが教える店舗&オフィスのセキュリティ対策術

最初にmyを付けない場合
@list=('a', 'aa', 'v', 'b', 'gg', 'x', 'def', 'ws', 'super', 'dd', 'wed', 'swd');
$key=grep{$list[$_] eq 'super'} (0 .. $#list);
print $key;

この時の実行結果は、1を示す。明らかに値は可笑しい。

次に、myを付けた場合
@list=('a', 'aa', 'v', 'b', 'gg', 'x', 'def', 'ws', 'super', 'dd', 'wed', 'swd');
my($key)=grep{$list[$_] eq 'super'} (0 .. $#list);
print $key;

この場合の実行結果は、8で正しい値を示します。

この両者の違いが分からない。何が原因をしているのだろうか。
その仕組を説明願います。

質問者からの補足コメント

  • うーん・・・

    myとは関係無く、my($key)の所を($key)にするだけで
    正しい値を表示します。

    ここで、再度の質問です。
    括弧を付けた場合と、付けない場合とでは何が違うのでしょうか。

      補足日時:2020/05/24 20:09
  • うーん・・・

    これは、私が思うには、括弧を付けない場合は得られた要素の数
    を返しているのでしょうか。

    括弧を付ける事で、$keyの所に要素の番号が得られると言う事でしょうか。

      補足日時:2020/05/24 20:11

A 回答 (1件)

https://perldoc.jp/func/grep
> LIST の個々の要素に対して、BLOCK か EXPR を評価し ($_ は、ローカルに個々の要素が設定されます) 、
> その要素のうち、評価した式が真となったものからなるリスト値が返されます。
> スカラコンテキストでは、式が真となった回数を返します。

$key=grep{$list[$_] eq 'super'} (0 .. $#list);
my $key=grep{$list[$_] eq 'super'} (0 .. $#list);

これはスカラのコンテキストになるので、「式が真となった回数」 = 1 になります。


my($key)=grep{$list[$_] eq 'super'} (0 .. $#list);

これはリストのコンテキストになり、1要素のリストの要素0 である $key に grepの戻り値(リスト)の要素0 を代入します。

https://perldoc.jp/docs/perl/5.14.1/perldata.pod …
> リスト自身を構成する個々の要素すべてに代入が許される場合にのみ、 全体のリストに代入を行なうことができます:
> ($a, $b, $c) = (1, 2, 3);
> ($map{'red'}, $map{'blue'}, $map{'green'}) = (0x00f, 0x0f0, 0xf00);
    • good
    • 0
この回答へのお礼

親切な說明有難う御座いました。

お礼日時:2020/05/24 21:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!