m_shige1979のときどきITブログ

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

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

https://github.com/mshige1979

perlの復習(map)

なぜかたいていはfor文とか使ってしまう

mapとかも使えたほうがイケてる感じがするので調べ直さないと…

map

配列の一覧を返す機能、値に加工などを行うことも可能

書式
map {
    なんかの処理
} 配列;

※{}で挟まれた部分でなんかの処理を行う
※セミコロンを忘れないようにしないと

例1
#!/usr/bin/env perl

use strict;
use warnings;

my $list = [111, 222, 333, 444, 555];

print "map sample\n";
map {
    print $_ . "\n";
} @{$list};

$ perl sample1.pl 
map sample
111
222
333
444
555
$

※単純に値を出力するサンプル

例2
#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

my $list = [111, 222, 333, 444, 555];

print "map sample\n";
my @list2 = map {
    "[" . $_ . "]";
} @{$list};

# あえてリファレンスで渡すとかわけわからんことしているような…
print Dumper(\@list2);

$ perl sample1.pl 
map sample
$VAR1 = [
          '[111]',
          '[222]',
          '[333]',
          '[444]',
          '[555]'
        ];
$

※配列に値を返す場合は%を指定することをわすれないようにしないといけない

例3
#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

my $list = [111, 222, 333, 444, 555, 111, 333];

print "map sample\n";
my %list2 = map {
    $_ => ""
} @{$list};

# あえてリファレンスで渡すとかわけわからんことしているような…
print Dumper(\%list2);

$ perl sample1.pl 
map sample
$VAR1 = {
          '444' => '',
          '555' => '',
          '111' => '',
          '333' => '',
          '222' => ''
        };
$

※なんかちょっと強引だけどハッシュ化することで重複キーを除去とかもできるかもしれない

grepは?

今回はやりませんでした。
私は普通の人より理解が遅いので1つずつやっていかないと混乱してしまう(´・ω・`)

一応こんな感じ
#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

my $list = [111, 222, 333, 444, 555];

print "map sample\n";
my @list2 = grep {
    if($_ % 2 == 0){
        $_
    }
} @{$list};

# あえてリファレンスで渡すとかわけわからんことしているような…
print Dumper(\@list2);

$ perl sample3.pl 
map sample
$VAR1 = [
          222,
          444
        ];
$

所感

1行で書くのが普通みたいだけどなんか他の情報がまざると間違いやすくなるのでブロック構文のように複数の行にしています。
何度も書けば慣れていくかも…
使いドコロを間違えないようにしないと