「Perl小技集」の版間の差分

提供: dococo wiki
ナビゲーションに移動 検索に移動
imported>Webmaster
imported>Webmaster
 
(同じ利用者による、間の13版が非表示)
2行目: 2行目:
 
== 言葉の理解 ==
 
== 言葉の理解 ==
 
=== 配列とリスト ===
 
=== 配列とリスト ===
同じ者だと思っていました。<br />
+
同じものだと思っていました。<br />
 
言葉的な違いで、配列は<code>'''変数'''</code>であり、リストは<code>'''表記法'''</code>ということらしい<br />
 
言葉的な違いで、配列は<code>'''変数'''</code>であり、リストは<code>'''表記法'''</code>ということらしい<br />
 
リストは値が並んでいるのをリストといいます<br />
 
リストは値が並んでいるのをリストといいます<br />
16行目: 16行目:
  
 
== 配列関係 ==
 
== 配列関係 ==
=== 値の表示・参照 ===
+
=== 値の表示・参照(一次元配列) ===
 
配列の各要素には、添え字を指定することで、以下のようにしてアクセスすることができます
 
配列の各要素には、添え字を指定することで、以下のようにしてアクセスすることができます
 
<syntaxhighlight lang="perl">
 
<syntaxhighlight lang="perl">
24行目: 24行目:
 
print encode('cp932',$make_union[0]);
 
print encode('cp932',$make_union[0]);
 
</syntaxhighlight>
 
</syntaxhighlight>
=== 配列一覧出力 ===
+
=== 配列一覧出力(一次元配列) ===
 
<code>for</code>や<code>while</code>で一つずつ参照して表示させても良いですが、以下のワンライナーで表示できます<br />
 
<code>for</code>や<code>while</code>で一つずつ参照して表示させても良いですが、以下のワンライナーで表示できます<br />
 
要素の1つずつ改行を付けて出力します<br />
 
要素の1つずつ改行を付けて出力します<br />
31行目: 31行目:
 
print join("\n", @make_union);
 
print join("\n", @make_union);
 
#encode文を挟む場合は以下の様な表現となる
 
#encode文を挟む場合は以下の様な表現となる
print OUT encode('cp932',join("\n", @make_union));
+
print encode('cp932',join("\n", @make_union));
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
=== 配列一覧出力(2次元配列) ===
 +
二次元(多次元)配列は以下の<code>for</code>文や<code>foreach</code>文で表示できます<br />
 +
<syntaxhighlight lang="perl">
 +
my @spec = ();
 +
my @chars = qw/z z a b c d e f/;
 +
push(@spec, \@chars);
 +
my @chars = qw/a b c d e f g/;
 +
push(@spec, \@chars);
 +
my @chars = qw/q w e r t y/;
 +
push(@spec, \@chars);
 +
#-------------------------------------------------------------------------------------------
 +
foreach my $tmp (@spec){
 +
foreach my $tmp2 (@$tmp){
 +
print "$tmp2 ";
 +
}
 +
print "\n";
 +
}
 +
# 1つずつ全体を表示(シンプルな方法)
 +
for my $ref( @spec ){
 +
for my $ref2( @{$ref} ){
 +
print $ref2, " ";
 +
}
 +
print "\n";
 +
}
 +
#-------------------------------------------------------------------------------------------
 +
# 1つずつ全体を表示
 +
for my $i( 0 .. $#spec ){
 +
for $j ( 0...$#{$spec[$i]} ){
 +
print "$i $j : $spec[$i][$j]\n";
 +
}
 +
}
 +
</syntaxhighlight>
 +
 +
=== 配列最後の要素を出力する ===
 +
<code>$#変数名</code>で参照できます<br />
 +
<syntaxhighlight lang="perl">
 +
#これで一番最後の配列に入っている値を表示できる
 +
print "$array[$#_array]\n";
 +
</syntaxhighlight>
 +
=== 配列の個数を表示する ===
 +
配列の個数は、左辺のスカラー変数に代入することで数でてきます。代入が無いと要素そのものが出力されます。<br />
 +
<syntaxhighlight lang="perl">
 +
my @spec = ()
 +
my @chars = qw/z z a b c d e f/;
 +
push(@spec, \@chars);
 +
 +
#配列の個数のスカラー変数に代入
 +
my $num = @{$chars[1]};
 +
 +
#z z a b c d e fが表示される
 +
print "@chars\n";
 +
 +
#要素数「8」が表示される
 +
print "$num\n";
 +
</syntaxhighlight>
 +
=== 配列の個数を表示する(2次元配列) ===
 +
配列の個数は、左辺のスカラー変数に代入することで数でてきます。代入が無いと要素そのものが出力されます。<br />
 +
2次元配列は結構面倒くさいです<br />
 +
 +
<syntaxhighlight lang="perl">
 +
 +
my @spec = ();
 +
 +
my @chars = qw/z z a b c d e f/;
 +
push(@spec, \@chars);
 +
 +
my @chars = qw/a b c d e f g/;
 +
push(@spec, \@chars);
 +
 +
my @chars = qw/q w e r t y/;
 +
push(@spec, \@chars);
 +
#-------------------------------------------------------------------------------------------
 +
#2次元配列の列の個数が表示される
 +
print $#spec;
 +
#2次元配列の行の個数が表示される(0行目)
 +
my $num = @{$spec[0]};
 +
print "$num\n";
 +
 +
#-------------------------------------------------------------------------------------------
 +
#二次元配列は普通の配列に、配列のリファレンス並んでいる
 +
#配列の個数のスカラー変数に代入
 +
 +
#要素数「8」が表示される
 +
$num = @{$spec[0]};
 +
print "要素数:$num\n";
 +
 +
#要素数「7」が表示される
 +
$num = @{$spec[1]};
 +
print "要素数:$num\n";
 +
 +
#要素数「6」が表示される
 +
$num = @{$spec[2]};
 +
print "要素数:$num\n";
 +
 +
#-------------------------------------------------------------------------------------------
 +
 +
#配列の最大インデックスは、変数名に『$#』を添えて表記します。
 +
#インデックス数「7」が表示される
 +
print "インデックス数:$#{$spec[0]}\n"; # 2次元配列変数からの@spec 0行目の最大インデックス
 +
 +
#インデックス数「6」が表示される
 +
print "インデックス数:$#{$spec[1]}\n"; # 2次元配列変数からの@spec 1行目の最大インデックス
 +
 +
#インデックス数「5」が表示される
 +
print "インデックス数:$#{$spec[2]}\n"; # 2次元配列変数からの@spec 1行目の最大インデックス
 +
 +
#-------------------------------------------------------------------------------------------
 +
#2次元配列の0行目「z z a b c d e f」が表示される
 +
for (my $i = 0; $i <= $#{$spec[0]}; $i++) {
 +
    print ${$spec[0]}[$i], "\n"; # 左は、$spec[0]->[$i]や$bbb[0][$i]と等価
 +
}
 +
 +
#2次元配列の1行目「a b c d e f g」が表示される
 +
for (my $i = 0; $i <= $#{$spec[1]}; $i++) {
 +
    print ${$spec[1]}[$i], "\n"; # 左は、$spec[1]->[$i]や$bbb[0][$i]と等価
 +
}
 +
 +
#2次元配列の1行目「a b c d e f g」が表示される
 +
for (my $i = 0; $i <= $#{$spec[1]}; $i++) {
 +
    print ${$spec[2]}[$i], "\n"; # 左は、$spec[2]->[$i]や$bbb[0][$i]と等価
 +
}
 +
 +
</syntaxhighlight>
 +
=== 配列の配列 ===
 +
'''データ構造の入れ子'''というのがあるので、言葉的には凄いややこしい。でも使い慣れるとデータの扱いが格段に広がるので理解したいために記載した。<br />
 +
基本的には
 +
=== 配列のハッシュ ===
 +
=== ハッシュの配列 ===
 +
EXCELのような列名(見出し項目)があって、行がレコードになるようなデータは、'''ハッシュの配列'''となる
 +
<syntaxhighlight lang="perl">
 +
 +
</syntaxhighlight>
 +
 +
=== ハッシュのハッシュ ===
 +
 
----
 
----
 
<!-- カテゴリに追加するページ名を記入 -->
 
<!-- カテゴリに追加するページ名を記入 -->
 
[[Category:Perl|こわざしゅう]]
 
[[Category:Perl|こわざしゅう]]

2017年10月14日 (土) 11:11時点における最新版

プログラミングをしばらくしていないと、いろいろ忘れるのでPerlで使用出来る個人的に覚えておきたい小技集を備忘録としてまとめました

言葉の理解

配列とリスト

同じものだと思っていました。
言葉的な違いで、配列は変数であり、リストは表記法ということらしい
リストは値が並んでいるのをリストといいます

# リスト
('a', 'b', 'c', 'd')

配列は変数なので、配列@arrayにリストの'a', 'b', 'c', 'd'を代入しているという言い方になるのでしょうか、意味的にはそんな言葉を使うのが良いのかも知れません。

# 配列への代入
my @array = ('a', 'b', 'c', 'd');

配列関係

値の表示・参照(一次元配列)

配列の各要素には、添え字を指定することで、以下のようにしてアクセスすることができます

#直接指定することで値を表示する。ここでは$make_unionというリストに入っている[0]番目の要素を表示する
print $make_union[0];
#encode文を挟む場合は以下の様な表現となる
print encode('cp932',$make_union[0]);

配列一覧出力(一次元配列)

forwhileで一つずつ参照して表示させても良いですが、以下のワンライナーで表示できます
要素の1つずつ改行を付けて出力します

#joinで1行毎に改行を入れて出力する
print join("\n", @make_union);
#encode文を挟む場合は以下の様な表現となる
print encode('cp932',join("\n", @make_union));

配列一覧出力(2次元配列)

二次元(多次元)配列は以下のfor文やforeach文で表示できます

my @spec = ();
my @chars = qw/z z a b c d e f/;
push(@spec, \@chars);
my @chars = qw/a b c d e f g/;
push(@spec, \@chars);
my @chars = qw/q w e r t y/;
push(@spec, \@chars);
#-------------------------------------------------------------------------------------------
foreach my $tmp (@spec){
foreach my $tmp2 (@$tmp){
print "$tmp2 ";
}
print "\n";
}
# 1つずつ全体を表示(シンプルな方法)
for my $ref( @spec ){
for my $ref2( @{$ref} ){
print $ref2, " ";
}
print "\n";
}
#-------------------------------------------------------------------------------------------
# 1つずつ全体を表示
for my $i( 0 .. $#spec ){
	for $j ( 0...$#{$spec[$i]} ){
	print "$i $j : $spec[$i][$j]\n";
	}
}

配列最後の要素を出力する

$#変数名で参照できます

#これで一番最後の配列に入っている値を表示できる
print "$array[$#_array]\n";

配列の個数を表示する

配列の個数は、左辺のスカラー変数に代入することで数でてきます。代入が無いと要素そのものが出力されます。

my @spec = ()
my @chars = qw/z z a b c d e f/;
push(@spec, \@chars);

#配列の個数のスカラー変数に代入
my $num = @{$chars[1]};

#z z a b c d e fが表示される
print "@chars\n";

#要素数「8」が表示される
print "$num\n";

配列の個数を表示する(2次元配列)

配列の個数は、左辺のスカラー変数に代入することで数でてきます。代入が無いと要素そのものが出力されます。
2次元配列は結構面倒くさいです

my @spec = ();

my @chars = qw/z z a b c d e f/;
push(@spec, \@chars);

my @chars = qw/a b c d e f g/;
push(@spec, \@chars);

my @chars = qw/q w e r t y/;
push(@spec, \@chars);
#-------------------------------------------------------------------------------------------
#2次元配列の列の個数が表示される
print $#spec;
#2次元配列の行の個数が表示される(0行目)
my $num = @{$spec[0]};
print "$num\n";

#-------------------------------------------------------------------------------------------
#二次元配列は普通の配列に、配列のリファレンス並んでいる
#配列の個数のスカラー変数に代入

#要素数「8」が表示される
$num = @{$spec[0]};
print "要素数:$num\n";

#要素数「7」が表示される
$num = @{$spec[1]};
print "要素数:$num\n";

#要素数「6」が表示される
$num = @{$spec[2]};
print "要素数:$num\n";

#-------------------------------------------------------------------------------------------

#配列の最大インデックスは、変数名に『$#』を添えて表記します。
#インデックス数「7」が表示される
print "インデックス数:$#{$spec[0]}\n"; # 2次元配列変数からの@spec 0行目の最大インデックス

#インデックス数「6」が表示される
print "インデックス数:$#{$spec[1]}\n"; # 2次元配列変数からの@spec 1行目の最大インデックス

#インデックス数「5」が表示される
print "インデックス数:$#{$spec[2]}\n"; # 2次元配列変数からの@spec 1行目の最大インデックス

#-------------------------------------------------------------------------------------------
#2次元配列の0行目「z z a b c d e f」が表示される
for (my $i = 0; $i <= $#{$spec[0]}; $i++) {
     print ${$spec[0]}[$i], "\n"; # 左は、$spec[0]->[$i]や$bbb[0][$i]と等価
}

#2次元配列の1行目「a b c d e f g」が表示される
for (my $i = 0; $i <= $#{$spec[1]}; $i++) {
     print ${$spec[1]}[$i], "\n"; # 左は、$spec[1]->[$i]や$bbb[0][$i]と等価
}

#2次元配列の1行目「a b c d e f g」が表示される
for (my $i = 0; $i <= $#{$spec[1]}; $i++) {
     print ${$spec[2]}[$i], "\n"; # 左は、$spec[2]->[$i]や$bbb[0][$i]と等価
}

配列の配列

データ構造の入れ子というのがあるので、言葉的には凄いややこしい。でも使い慣れるとデータの扱いが格段に広がるので理解したいために記載した。
基本的には

配列のハッシュ

ハッシュの配列

EXCELのような列名(見出し項目)があって、行がレコードになるようなデータは、ハッシュの配列となる

ハッシュのハッシュ