Perl-arrays

提供:Dev Guides
移動先:案内検索

Perl-配列

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

これは、配列変数を使用する簡単な例です-

#!/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

ここで、二重ドット(..)は*範囲演算子*と呼ばれます。 これは、次の結果を生成します-

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 関数を使用してさまざまな値を印刷してきました。 同様に、さまざまな他の機能またはサブルーチンと呼ばれることもありますが、これらはさまざまな他の機能に使用できます。

Sr.No. Types & Description
1

push COMMATARRAY, LIST

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

2

pop COMMATARRAY

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

3

shift COMMATARRAY

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

4

unshift COMMATARRAY, 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

配列要素の置き換え

今、私たちは* splice()*と呼ばれるもう1つの関数を紹介しようとしています。

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

ここで、実際の置換は5番目の要素が6から10に21、22、23、24、25の数字に置き換えられた後、6番目の数字から始まります。

文字列を配列に変換する

次の構文を持つ* split()*と呼ばれるもう1つの関数を見てみましょう-

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に設定すると、すべての配列でオンベースのインデックスが使用されます。 ゼロ以外のインデックスを使用しないことをお勧めします。 ただし、$ [変数の使用法を示すために例を見てみましょう-
#!/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