My First Perl #3

ということ(?)で、関数とクラスあたりのステップに行こうと思う

関数

関数は sub を使う。と
しかも sub が sub たる理由はサブルーチン。なるほど。

1
2
3
4
5
6
7
8
9
use strict;
use warnings;

sub hoge {
  my $arg1 = shift;
  print $arg1 . "\n";
}

hoge('hello world');

shift に引数はないけど、引数を先頭から取得するときに使うらしい。
少し謎。
どうやら shift の引数なしは shift @_ と同義らしい http://d.hatena.ne.jp/perlcodesample/20101130/1298764341

もう少し引数を受け取りましょう。
構造体Hashとか

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use strict;
use warnings;

#my %hoge = (a => 1, b => 2);
# HashをHashとして出力するときは %hash なのね。。
#print %hoge . "\n";
# でもkeyの値を出すときは $hash なのね。。
#print $hoge{a} . "\n";

sub foo {
  my $value_1 = $_[0];
  print $value_1 . "\n";
  # ==> a と出る

  my $value_2 = ref $_[0];
  print $value_2 . "\n";
  # ==> 何もでない

  my $value_3 = ref {@_};
  print $value_3 . "\n";
  # ==> Hash と出る...ということはこれでHashを受け取れたハズ。

  #print $value_3{a} . "\n";
  # ==> 'Global symbol "%value_3" requires explicit package' えええええ!

  #my %value_4 = ref {@_};
  #print $value_4{a} . "\n";
  # ==> 'Odd number of elements in hash assignment' えええええええええ!!

  # 素直に。。
  my %value_5 = @_;
  print $value_5{a} . "\n";
  print $value_5{b} . "\n";
}

foo((a => 1, b => 2));

最初に http://d.hatena.ne.jp/perlcodesample/20101130/1298764341 を読んだのがマズかったか。。。
やっぱりサンプルコードがあるほうがいいよね。
というっことで、 $value_(1..4) あでは、上記の記事をナナメ読みして頑張った結果。
$value_5 というフツーな方法で大丈夫だと知ったのは http://d.hatena.ne.jp/perlcodesample/20080605/1212675666 の記事を読んでから。。

正直 $value_3{a} と $value_4{a} がエラーになる理由が全然少しもわからん
構文から学ぶべきだった。。。

perl って、%だったり $とか @とか タイヘンです。。

今回は sub 、もといサブルーチンに衝撃を受けたので、次回にでもクラスをやろう。。