Skip to content

Instantly share code, notes, and snippets.

@note103
Last active April 11, 2016 07:41
Show Gist options
  • Select an option

  • Save note103/8919eff343ce79d24ed81d75d28614b2 to your computer and use it in GitHub Desktop.

Select an option

Save note103/8919eff343ce79d24ed81d75d28614b2 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
# 1. 以下の無名サブルーチンがあったとして、
my $f = sub {
my $s = shift;
for my $i (@$s) {
say $i;
}
};
# 2. 以下の配列リファレンスを「1」で回したいとき、
my $source = [qw/apple orange grape/];
# 3. 以下は実行されるが、
$f->($source);
#=> apple
#=> orange
#=> grape
#=>
# 4. 以下は実行されないのが何故なのか、理解できていない。
m();
sub m {
my $source = [qw/apple orange grape/];
$f->($source);
}
#=> Use of uninitialized value $_ in pattern match (m//) at /path/to/for-subroutine-practice.pl line 29.
# 5. 関数名が 'm' だから駄目だった模様……。
n();
sub n {
my $source = [qw/apple orange grape/];
$f->($source);
}
#=> apple
#=> orange
#=> grape
#=>
@papix
Copy link

papix commented Apr 11, 2016

なるほど. m()がパターンマッチと解釈されているんですな. m//だと, /は対応する記号でいけるので, m()もパターンマッチとして正しいので, コード書いてる人はサブルーチン呼び出しと思っていてもPerlはパターンマッチと解釈している, と.

どうしてもmというサブルーチンにするなら, &m()とかで呼ぶしかなさそうですね.

@note103
Copy link
Author

note103 commented Apr 11, 2016

ああ〜、なるほど。 m がその後の( )を正規表現のデリミタにしてしまっているんですね……

なんで m が駄目なのか、なんでパターンマッチとか言われているのか、などはわからないままでした。
(組み込み関数のように、すでに予約されているのか? とか思ってました……)
(エラーメッセージでパターンマッチがどう、とか言っているのは一応読んでいたけどまったく想像力働かず)

で、おっしゃるとおり & を使ったらちゃんと呼び出されました。把握!ありがとうございます!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment