m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

perlの復習(配列やハッシュ)

時々Perlのソースを見ていくと?というソースがある

Perlの配列やハッシュを引数で設定しているからでした。

ちょっと簡略化すると以下のような感じ

配列

sample1.pl
#!/usr/bin/env perl
use strict;                                                                                                                                            
use warnings;                                                                                                                                          
use Data::Dumper;                                                                                                                                      
                                                                                                                                                       
sub test1{
  my @list = @_;
 
  print "test1 start\n";
  print Dumper(@list);
  print "test1 end\n\n"
}                                                                                                                                                    
                                                                                                                                                       
# type1
test1("111", "222", "333");                                                                                                                            
                                                                                                                                                       
# type2                                                                                                                                                
my @list1 = qw/aaa bbb/;                                                                                                                               
test1(@list1, "ccc");                                                                                                                                  
                                                                                                                                                       
# type3                                                                                                                                                
my @list2 = ("xxx", "yyy", "zzz");                                                                                                                     
test1(@list2);                                                                                                                                         
                                                                                                                                                       
#type4                                                                                                                                                 
my $list3 = ["abc", "def", "ghi"];                                                                                                                     
test1(@{$list3});        

$ perl test1.pl                                                                                                                          
test1 start
$VAR1 = '111';
$VAR2 = '222';
$VAR3 = '333';
test1 end
 
test1 start
$VAR1 = 'aaa';
$VAR2 = 'bbb';
$VAR3 = 'ccc';
test1 end
 
test1 start
$VAR1 = 'xxx';
$VAR2 = 'yyy';
$VAR3 = 'zzz';
test1 end
 
test1 start
$VAR1 = 'abc';
$VAR2 = 'def';
$VAR3 = 'ghi';
test1 end
 
mshige1979: ~ $ 

今までの手法の場合はtype1のように関数(サブルーチン)に1つずつに変数を設定して引数を渡すことを行っていたわけですが、Perlの場合は配列やハッシュで受け取れるので…

ハッシュ

sample3.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
 
sub test1{
  my %hash = @_;
 
  print "test1 start \n";
  for my $key (keys %hash){
    print "$key:" . $hash{$key} . "\n";
  }
  print "test1 end\n\n";
 
}
 
# type1
test1(
  aaa => 100,
  bbb => 200,
  ccc => 300
);
 
# type2
my %hash1 = (
  xxx => 777,
  yyy => 888,
);
test1(
  %hash1,
  zzz => 999,
);
 
# type3                                                                                                                                                
my %hash2 = (
  abc => 123,
  def => 456,
  ghi => 789
);
test1(%hash2);

$ perl test3.pl                                                                                                                          
test1 start 
ccc:300
aaa:100
bbb:200
test1 end
 
test1 start 
yyy:888
zzz:999
xxx:777
test1 end
 
test1 start 
abc:123
ghi:789
def:456
test1 end
$

一部だけハッシュや配列で固められているとちょっととまどいそうだけどまあ、やっと理解してきた感じ
cpanのソースやいろいろな場所のサンプルソースはこの書き方が普通に行われているので意識しておく必要がありそうです