2013年3月7日木曜日

配列に配列を挿入する

配列に配列を挿入するには、spliceを使います。



my @foo = qw(ari hituji inko cat dog);
my @baa = qw(sky tree note memo);

splice(@foo, 1, 0, @baa); # 配列fooの1番目に配列baaを挿入

my $i = 0;
foreach my $item(@foo) {
    print "[$i]:$item\n";
    $i++;
}



結果は以下のようになります。


[0]:ari
[1]:sky
[2]:tree
[3]:note
[4]:memo
[5]:hituji
[6]:inko
[7]:cat
[8]:dog




配列の要素を削除

配列の要素を削除するには、spliceを使います。



my @foo = qw(ari hituji inko cat dog);

splice(@foo, 2, 2); # 2番目の要素から2つ削除

my $i = 0;
foreach my $item(@foo) {
    print "[$i]:$item\n";
    $i++;
}




結果は以下のようになります。


[0]:ari
[1]:hituji
[2]:dog




配列の全ての要素を加工する

配列の全ての要素を加工するには、mapを使います。


use utf8;
binmode STDIN, "utf8";
binmode STDOUT, "utf8";

my @foo = qw(ari hituji inko cat dog);

@hoge = map { my $hogehoge = $_."さん" } @foo;

my $i = 0;
foreach my $item(@hoge) {
    print "[$i]:$item\n";
    $i++;
}


結果は以下のようになります。


[0]:ariさん
[1]:hitujiさん
[2]:inkoさん
[3]:catさん
[4]:dogさん



複数配列から重複しない行のみ抽出する

複数配列から重複しない行のみ抽出するには、以下のようにgrepを使います。



#!/opt/local/bin/perl
use utf8;


my @foo = qw(ari hituji inko cat dog);
my @baa = qw(cat ebi kuma hituji tora cat);

my %count;
$count{$_}++ for (@foo, @baa); # @fooと@baaの要素の数を数える
@hoge = grep { $count{$_} < 2 } keys %count; # 要素数が2より小さいもののみ抽出

my $i = 0;
foreach my $item(@hoge) {
    print "[$i]:$item\n";
    $i++;
}





結果は以下のようになります。



[0]:ari
[1]:inko
[2]:dog
[3]:ebi
[4]:kuma
[5]:tora




複数配列から重複行を抽出する


複数配列から重複行を取り出すには、grepを使うと便利です。


#!/opt/local/bin/perl
use utf8;

my @foo = qw(ari hituji inko cat dog);
my @baa = qw(cat ebi kuma hituji tora);

my %seen;
my $i = 0;
my @hoge = grep { ++$seen{$_} == 2 } (@foo, @baa);
foreach my $item(@hoge) {
    print "[$i]:$item\n";
    $i++;
}


結果は以下のようになります。




[0]:cat
[1]:hituji




1行目

Perlに限った話ではありませんが、ソースファイルの1行目には以下の様な記述をよく見かけます。


#!/opt/local/bin/perl


これはperl言語特有のものではなく、Linux等のシェルのお約束です。
上記の様に「#!」から始まる記述があることで、例えば普段はperlのプログラムを起動する時に、

perl hoge.pl

のように起動しますが、上記の記述があれば

hoge.pl

で起動できるようになります。(もちろん実行権限が付与されている必要があります。)

上の例では、シェルが実行権限の付いたhoge.plを開きますが、最初の行に「#!」から始まる行があることで、以降の/opt/local/bin/perlを起動し、その引数として自ファイルを渡してくれるようになります。

ですので、必ず

perl hoge.pl

等のように起動する人にとっては「#!」の行はいらないことになります。
ただし、他の人が同ファイルを起動しようとして

「hoge.pl」で起動できない!なんじゃこりゃ!?

と困ることがあるかもしれないので、お約束として付けておくのが習慣になっているようです。

ちなみに、「#!」の行は必ず1行目にある必要があります。2行めとかにあってもシェルは認識してくれません。



2013年3月6日水曜日

配列を任意の文字列で区切って表示する

joinを使えば配列を任意の文字列で区切って表示することができます。



@foo = qw(A B C D E F);

print join("\t", @foo)."\n"; # 配列をタブ区切りで表示



結果は以下のようになります。

A B C D E F