Perl-配列

配列は、スカラー値の順序付きリストを格納する変数です。配列変数の前には「アットマーク」(@)記号が付いています。配列の単一の要素を参照するには、ドル記号($)を使用し、変数名の後に角括弧で囲まれた要素のインデックスを付けます。

配列変数を使用する簡単な例を次に示します-

#!/usr/bin/perl

@ages = (25, 30, 40);             
@names = ("John Paul", "Lisa", "Kumar");

print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";

ここでは、$記号の前にエスケープ記号(\)を使用して印刷しています。他のPerlはそれを変数として理解し、その値を出力します。実行すると、次の結果が生成されます-

$ages[0] = 25
$ages[1] = 30
$ages[2] = 40
$names[0] = John Paul
$names[1] = Lisa
$names[2] = Kumar

Perlでは、リストと配列の用語は、交換可能であるかのように使用されることがよくあります。ただし、リストはデータであり、配列は変数です。

アレイの作成

配列変数の前には@記号が付き、括弧またはqw演算子を使用して入力されます。例-

@array = (1, 2, 'Hello');
@array = qw/This is an array/;

2行目では、qw //演算子を使用しています。この演算子は、区切られた文字列を空白で区切って文字列のリストを返します。この例では、これにより4要素の配列になります。最初の要素は「this」で、最後(4番目)は「array」です。これは、次のように異なる行を使用できることを意味します-

@days = qw/Monday
Tuesday
...
Sunday/;

次のように各値を個別に割り当てることで、配列にデータを入力することもできます。

$array[0] = 'Monday';
...
$array[6] = 'Sunday';

配列要素へのアクセス

配列から個々の要素にアクセスするときは、変数の前にドル記号($)を付けてから、変数名の後に角括弧内の要素インデックスを追加する必要があります。例-

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

print "$days[0]\n";
print "$days[1]\n";
print "$days[2]\n";
print "$days[6]\n";
print "$days[-1]\n";
print "$days[-7]\n";

これにより、次の結果が生成されます-

Mon
Tue
Wed
Sun
Sun
Mon

配列のインデックスはゼロから始まるため、最初の要素にアクセスするには、インデックスとして0を指定する必要があります。負のインデックスを指定することもできます。その場合、配列の最初ではなく最後から要素を選択します。これは次のことを意味します-

print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon

連番配列

Perlは、連番と文字のショートカットを提供します。たとえば、100まで数えるときに各要素を入力するのではなく、次のようにすることができます。

#!/usr/bin/perl

@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);

print "@var_10\n";   # Prints number from 1 to 10
print "@var_20\n";   # Prints number from 10 to 20
print "@var_abc\n";  # Prints number from a to z

ここでは二重ドット(..)は range operator。これにより、次の結果が生成されます-

1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z

配列サイズ

配列のサイズは、配列のスカラーコンテキストを使用して決定できます-戻り値は配列内の要素の数になります-

@array = (1,2,3);
print "Size: ",scalar @array,"\n";

返される値は、有効な要素の数ではなく、常に配列の物理サイズになります。これを実証できます。このフラグメントを使用したスカラー@arrayと$#arrayの違いは次のとおりです。

#!/usr/bin/perl

@array = (1,2,3);
$array[50] = 4;

$size = @array;
$max_index = $#array;

print "Size:  $size\n";
print "Max Index: $max_index\n";

これにより、次の結果が生成されます-

Size: 51
Max Index: 50

配列には情報を含む要素が4つしかありませんが、配列の長さは51要素で、最高のインデックスは50です。

配列内の要素の追加と削除

Perlには、配列内の要素を追加および削除するための便利な関数がいくつか用意されています。関数とは何か疑問があるかもしれません。これまでに使用したprintさまざまな値を出力する関数。同様に、他のさまざまな機能、またはサブルーチンと呼ばれることもあり、他のさまざまな機能に使用できます。

シニア番号 タイプと説明
1

push @ARRAY, LIST

リストの値を配列の最後にプッシュします。

2

pop @ARRAY

ポップオフして、配列の最後の値を返します。

3

shift @ARRAY

配列の最初の値をオフにシフトして返し、配列を1短くして、すべてを下に移動します。

4

unshift @ARRAY, LIST

リストを配列の先頭に付加し、新しい配列の要素数を返します。

#!/usr/bin/perl

# create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1. \@coins  = @coins\n";

# add one element at the end of the array
push(@coins, "Penny");
print "2. \@coins  = @coins\n";

# add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3. \@coins  = @coins\n";

# remove one element from the last of the array.
pop(@coins);
print "4. \@coins  = @coins\n";

# remove one element from the beginning of the array.
shift(@coins);
print "5. \@coins  = @coins\n";

これにより、次の結果が生成されます-

1. @coins = Quarter Dime Nickel
2. @coins = Quarter Dime Nickel Penny
3. @coins = Dollar Quarter Dime Nickel Penny
4. @coins = Dollar Quarter Dime Nickel
5. @coins = Quarter Dime Nickel

配列要素のスライス

配列から「スライス」を抽出することもできます。つまり、配列から複数のアイテムを選択して、別の配列を生成することもできます。

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3,4,5];

print "@weekdays\n";

これにより、次の結果が生成されます-

Thu Fri Sat

スライスの仕様には、正または負の有効なインデックスのリストがあり、それぞれがコンマで区切られている必要があります。速度については、.. 範囲演算子-

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3..5];

print "@weekdays\n";

これにより、次の結果が生成されます-

Thu Fri Sat

配列要素の置き換え

次に、というもう1つの関数を紹介します。 splice()、次の構文があります-

splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]

この関数は、OFFSETおよびLENGTHで指定された@ARRAYの要素を削除し、指定されている場合はそれらをLISTに置き換えます。最後に、配列から削除された要素を返します。以下は例です-

#!/usr/bin/perl

@nums = (1..20);
print "Before - @nums\n";

splice(@nums, 5, 5, 21..25); 
print "After - @nums\n";

これにより、次の結果が生成されます-

Before - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
After - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20

ここで、実際の置換は6番目の番号から始まり、その後5つの要素が6から10に番号21、22、23、24、および25に置き換えられます。

文字列を配列に変換する

と呼ばれるもう1つの関数を調べてみましょう split()、次の構文があります-

split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

この関数は、文字列を文字列の配列に分割して返します。LIMITが指定されている場合、最大でその数のフィールドに分割されます。PATTERNを省略すると、空白で分割されます。以下は例です-

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string);
@names  = split(',', $var_names);

print "$string[3]\n";  # This will print Roses
print "$names[4]\n";   # This will print Michael

これにより、次の結果が生成されます-

Roses
Michael

配列を文字列に変換する

使用できます join()配列要素を再結合し、1つの長いスカラー文字列を形成する関数。この関数の構文は次のとおりです-

join EXPR, LIST

この関数は、LISTの個別の文字列を、EXPRの値で区切られたフィールドを持つ単一の文字列に結合し、文字列を返します。以下は例です-

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string);
@names  = split(',', $var_names);

$string1 = join( '-', @string );
$string2 = join( ',', @names );

print "$string1\n";
print "$string2\n";

これにより、次の結果が生成されます-

Rain-Drops-On-Roses-And-Whiskers-On-Kittens
Larry,David,Roger,Ken,Michael,Tom

配列の並べ替え

ザ・ sort()関数は、ASCII数値標準に従って配列の各要素をソートします。この関数の構文は次のとおりです-

sort [ SUBROUTINE ] LIST

この関数は、LISTをソートし、ソートされた配列値を返します。SUBROUTINEが指定されている場合、要素のソート中にSUBTROUTINE内の指定されたロジックが適用されます。

#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";

# sort this array
@foods = sort(@foods);
print "After: @foods\n";

これにより、次の結果が生成されます-

Before: pizza steak chicken burgers
After: burgers chicken pizza steak

ソートは単語のASCII数値に基づいて実行されることに注意してください。したがって、最良のオプションは、最初に配列のすべての要素を小文字に変換してから、ソート機能を実行することです。

$ [特殊変数

これまで、プログラムで定義し、それらを使用してスカラー値と配列値を格納および出力する単純な変数を見てきました。Perlは、事前定義された意味を持つ多数の特別な変数を提供します。

特別な変数があり、次のように記述されます。 $[。この特別な変数は、すべての配列の最初のインデックスを含むスカラーです。Perl配列にはゼロベースのインデックスがあるため、$ [はほとんどの場合0になります。ただし、$ [を1に設定すると、すべての配列でオンベースのインデックスが使用されます。ゼロ以外のインデックスを使用しないことをお勧めします。ただし、$ [変数-の使用法を示す1つの例を見てみましょう。

#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Foods: @foods\n";

# Let's reset first index of all the arrays.
$[ = 1;

print "Food at \@foods[1]: $foods[1]\n";
print "Food at \@foods[2]: $foods[2]\n";

これにより、次の結果が生成されます-

Foods: pizza steak chicken burgers
Food at @foods[1]: pizza
Food at @foods[2]: steak

配列のマージ

配列は単なるコンマ区切りの値のシーケンスであるため、以下に示すようにそれらを組み合わせることができます。

#!/usr/bin/perl

@numbers = (1,3,(4,5,6));

print "numbers = @numbers\n";

これにより、次の結果が生成されます-

numbers = 1 3 4 5 6

埋め込まれた配列は、以下に示すように、メイン配列の一部になります。

#!/usr/bin/perl

@odd = (1,3,5);
@even = (2, 4, 6);

@numbers = (@odd, @even);

print "numbers = @numbers\n";

これにより、次の結果が生成されます-

numbers = 1 3 5 2 4 6

リストから要素を選択する

リストの表記は、配列の表記と同じです。リストに角かっこを追加し、1つ以上のインデックスを指定することで、配列から要素を抽出できます。

#!/usr/bin/perl

$var = (5,4,3,2,1)[4];

print "value of var = $var\n"

これにより、次の結果が生成されます-

value of var = 1

同様に、先頭の@文字は必要ありませんが、スライスを抽出できます。

#!/usr/bin/perl

@list = (5,4,3,2,1)[1..3];

print "Value of list = @list\n";

これにより、次の結果が生成されます-

Value of list = 4 3 2