-
Notifications
You must be signed in to change notification settings - Fork 2
/
slide.md
1901 lines (1170 loc) · 45.1 KB
/
slide.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# Perl 入学式 第 3 回
## 条件分岐 / 配列 / ハッシュ編
---
## 諸注意
### 会場について
- 飲食の可否
- 手洗いの場所
- 喫煙場所
---
## 諸注意
### 講義の進行について
- 講義中の疑問点
- うまくプログラムが動かない
- 分からない
上記についてはサポーターが適宜回答やアドバイスを Discord でおこないます。
テキストまたは音声チャットにて個別にサポートしますので、気軽に質問してください。
- <a href="https://discord.gg/2QNqVyk" target="_blank">Discord | 会話や交流が楽しめるプラットフォーム</a>
---
## 諸注意
### 講義環境について
- Youtube
- スライド共有ツール
- Discord
---
## 諸注意
### 本日のサポーター紹介
---
# <ruby>if<rt>イフ</rt></ruby> 文
---
## if 文
### 条件分岐
プログラムは上から下へ順番に処理されていきます。
しかし、変数の状態に応じてプログラムの動きを分岐させることができます。これを **条件分岐** といいます。
条件分岐には様々なパターンがありますが、それらを **<ruby>真<rt>しん</rt></ruby>** と **<ruby>偽<rt>ぎ</rt></ruby>** の 2 つの組み合わせで表現します。
真 または 偽 の判断に用いる式を **条件式** といいます。
---
## if 文
### 条件式
条件式、といっても難しいことではありません。
以下の条件式は「信号が青であるか、青ではないか」を判断し、その結果行う行動を示しています。
普段おこなっている人間の判断に近いものです。
- 信号が青である(真)なら、横断歩道を渡る
- 信号が青でない(偽)なら、待機する
---
## if 文
### Perl における真値
条件式の結果は 真 または 偽 となります。
Perl では、次のページの 5 つの値が「偽」の値として扱われます。
これ以外の値は、Perl では全て「真」として扱われます。
例示などで「真の値」が必要なときは数字の **1** が利用されます。
---
## if 文
### Perl における偽値
1. 数値「`0`」
1. 文字列「`'0'`」
1. 文字列「`''`」(シングルクォーテーションの連続、間に何もない。空文字ともいう。)
1. 空のリスト「`()`」 Perl 入学式では扱わない
1. `undef`(値が入っていないスカラー変数)Perl 入学式では扱わない
---
## if 文
### Perl には true/false がない
他のプログラミング言語では、<ruby>`true`<rt>トゥルー</rt></ruby> や <ruby>`false`<rt>フォルス</rt></ruby> という単語に 真 または 偽 の意味を持たせたキーワードとして扱うことがあります。
しかし、Perl は `true` や `false` といった、ひと目で真偽値であることがわかる組み込みのキーワードはありません。
あくまで、Perl では先に述べた 5 つの偽値のみが偽、それ以外はすべて真となります。
---
## if 文
### if 文の構文(擬似プログラム)
```perl
if ( 条件式 ) {
条件式の結果が 真 の場合に実行されるブロック;
}
else {
条件式の結果が 偽 の場合に実行されるブロック;
}
```
- 丸括弧 `( )` の中に条件式を書く。
- 波括弧 `{ }` の中に 真の場合のプログラムを書く。なお、`{ }` で囲まれた部分を **ブロック** と呼ぶ。
- 偽の場合にもプログラムが必要な場合には <ruby>`else`<rt>エルス</rt></ruby> の後のブロックに書く。
---
## if 文
### if 文の構文(擬似プログラム)
先の青信号の例で例えてみます。
```perl
if ( 信号が青だ ) {
信号を渡る
}
else {
待機する
}
```
---
## if 文
### if 文の構文(Perl のプログラム)
```perl
if ( 1 ) { # 条件式が明示的な「真」の値である 1
print "OK\n"; # 条件が「真」なので出力される
}
else{
print "NG\n"; # 実行されず、したがって出力されない
}
```
---
## if 文
### if 文の構文(Perl のプログラム)
```perl
if ( 0 ) { # 条件式が「偽」の値である 0
print "OK\n"; # 実行されない
}
else{
print "NG\n"; # 条件が「偽」なので出力される
}
```
---
## 比較演算子
---
## 比較演算子
### 数値の比較演算子
if 文は条件式によって実行結果が変わります。
この条件式の中で利用するのが **比較演算子** です。まずは数値の比較演算子を紹介します。
```perl
== # 右辺と左辺が等しいならば「真」
!= # 右辺と左辺が等しくないならば「真」
< # 右辺より左辺が小さいならば「真」
> # 右辺より左辺が大きいならば「真」
<= # 右辺が左辺以上ならば「真」
>= # 右辺が左辺以下ならば「真」
```
---
## 比較演算子
### 数値を使った条件分岐の例
```perl
my $num = 1;
if ( $num == 1 ) { # <= ( ) の中が条件式!
print "OK\n"; # こちらが表示される
}
else {
print "NG\n";
}
```
条件式は `( )` の中の `$num == 1` です。
---
## 比較演算子
### 数値を使った条件分岐の例
```perl
my $num = 1;
if ( $num == 1 ) { # <= ( ) の中が条件式!
print "OK\n"; # こちらが表示される
}
else {
print "NG\n";
}
```
`==` は **右辺と左辺を数値として比較** します。
条件式内で `$num` が `1` と等しい場合に「真」となり、`OK` という文字が表示されます。
`$num` が `1` と等しくない場合は、「偽」となり `else` に処理が移って `NG` という文字が表示されます。
---
## 比較演算子
### 数値比較のよくあるまちがい (1)
```perl
my $num == 1; # NG
my $num = 1; # OK
```
数値の比較に用いる `==` と、代入演算子の `=` を間違えています。
この場合、実行すると以下の警告が出ます。
```plaintext
Useless use of numeric eq (==) in void context
```
---
## 比較演算子
### 数値比較のよくあるまちがい (2)
```perl
my $num = 1;
if ($num = 1) { print $num } # NG
if ($num == 1) { print $num } # OK
```
条件式に注目してください。代入演算子の `=` と、数値の比較に用いる `==` を間違えています。
この場合、実行すると以下の警告が出ます。
```perl
Found = in conditional, should be ==
```
---
## 比較演算子
### 文字列の比較演算子
文字列を比較する場合は `eq` や `ne` といった単語を用いた比較演算子を使います。
```perl
eq # equal
ne # not equal
gt # greater than
ge # greater equal
lt # less than
le # less equal
```
---
## 比較演算子
### 文字列の比較演算子
文字列を比較する場合は `eq` や `ne` といった単語を用いた比較演算子を使います。
また、`lt` や `gt` などで比較する「文字列の大小」とは、文字列の長さではありません。
辞書順に並べた時に前にくるものが小さく、後ろにくるものが大きいと判断されます。
---
## 比較演算子
### 文字列を使った条件分岐
条件式に注目してください。
```perl
my $foo = 'hello';
if ( $foo eq 'hello' ) { # ( ) 内が条件式
print "OK\n"; # こちらが表示される
}
else {
print "NG\n";
}
```
文字列を比較するので、 `==` ではなく `eq`を用います
---
## 比較演算子
### 数値 と 文字列 の比較が混合している<br>アンチパターン
```perl
print "eq で評価すると、";
if ( '51.0' eq 51 ) {
print "文字列'51.0' と 数値 51 は等しい\n";
}
else {
print "文字列'51.0' と 数値 51 は等しくない\n"; # こちらが表示される
}
```
`eq` は文字列を比較するときに使う比較演算子です。
このため、条件式の左辺・右辺は文字列として比較され、 **異なる** と判断されます。
---
## 比較演算子
### 数値 と 文字列 の比較が混合している<br>アンチパターン
```perl
print "== で評価すると、";
if ( '51.0' == 51 ) {
print "文字列'51.0' と 数値 51 は等しい\n"; # こちらが表示される
}
else {
print "文字列'51.0' と 数値 51 は等しくない\n";
}
```
条件式の比較演算子を `eq` から `==` に変更すると、先ほどとは逆の結果となります。数値として比較されるためです。
---
## 比較演算子
### 数値 と 文字列 の比較が混合している<br>アンチパターン
条件式を書くときは、
- 数値を比較したい
- 文字列を比較したい
どちらを比較するのかを明確にした上で、対応した比較演算子を選ぶことが重要です。
---
## 比較演算子
### 複数の条件分岐
<ruby>`elsif`<rt>エルジフ</rt></ruby> を使うことで、分岐条件を増やすことができます。
`else if` ではなく、 **`elsif`** です。
---
## 比較演算子
### 複数の条件分岐
```perl
my $num = 1;
if ( $num == 1 ) {
print '$num is One' . "\n"; # これが表示される
}
elsif ( $num == 2 ) {
print '$num is Two' . "\n";
}
elsif ( $num == 3 ) {
print '$num is Three' . "\n";
}
else {
print '$num is not even One, even Two, even Three' . "\n";
}
```
---
## 練習問題 `big_or_small.pl`
```perl
#!/usr/bin/env perl
use strict;
use warnings;
my $mycard = 10; # 1から13までの好きな数字を入力しておく
```
トランプの大小判定ゲームを作ってみよう。
1. 変数 `$mycard` に 1 から 13 までの好きな数字(これがトランプの手札)を代入します。
2. `$mycard` の数が 7 より大きければ `BIG` と表示します。
3. それ以外(7 以下)であれば、 `SMALL` と表示します。
---
## 練習問題 `big_seven_small_arg.pl`
先に作ったトランプの大小判定ゲームを改良してみよう。
1. 変数 `$mycard` に、コマンドライン引数を利用して 1 から 13 までの好きな数字を直接入力できる様に改造しよう。
2. `$mycard` の数が 7 より大きければ `BIG!` と表示します。
3. `$mycard` の数が 7 と等しければ、 `Seven!` と表示します。
4. `$mycard` の数が 7 未満であれば、 `SMALL!` と表示します。
---
## 出来た方は、Discord のテキストチャットで「出来た!」とリアクションお願いします!
---
## 休憩 & 質問 & 雑談 タイム<br>(5 〜 10 分)
---
# 論理演算子
---
## 論理演算子
### 論理演算子 AND, OR
`if文` の条件式でより複雑な条件を扱いたいときは **論理演算子** を用いて複数の条件を連結します。
```perl
&& # かつ
|| # または
```
- `&&` 演算子は「かつ・AND」の意味を持つ。 `&&` の両辺の条件が 真 となるときのみ 真 となる。
- `||` 演算子は「または・OR」の意味を持つ。 `||` 両辺のうち、片方が 真 ならば 真 となる。
---
## 論理演算子
### AND
条件式に注目してください。
```perl
my $num = 10;
if ( $num > 0 && $num % 2 == 0 ) { # $num が 0 より大きい かつ 2 で割り切れる
print "&& : OK\n"; # こちらが表示される
}
else{
print "&& : NG\n"
}
```
---
## 論理演算子
### AND
先の条件式の抜粋です。
```perl
my $num = 10;
if ( $num > 0 && $num % 2 == 0 ) {
```
1. `&&` の左辺にある `$num` が 0 より大きいので、`$num > 0` は 真。
1. `&&` の右辺にある `$num` を 2 で割った剰余は 0 なので、`$num % 2 == 0` も 真。
1. 「1. かつ 2. が 真」の条件を満たすので、条件式は 真 となり、`&&: OK` と表示される。
---
## 論理演算子
### OR
条件式に注目してください。
```perl
my $num = 10;
if ( $num > 0 || $num % 2 == 1 ) { # $num が 0 より大きい または 2 で割り切れない
print "|| : OK\n"; # こちらが表示される
}
else{
print "&& : NG\n"
}
```
---
## 論理演算子
### OR
先の条件式の抜粋です。
```perl
my $num = 10;
if ( $num > 0 || $num % 2 == 1 ) {
```
1. `||` の左辺にある `$num` が 0 より大きいので、`$num > 0` は 真。
1. 「1. または 2. が 真」の条件のうち、「1. が 真 」を満たすので、条件式は 真 となり、`||: OK` と表示される。右辺は比較されない。
---
## 論理演算子
### 3 つ以上の値を比較したい場合( Perl 5.32 以降)
```perl
my $small = 10;
my $medium = 20;
my $large = 30;
if ( $small < $medium <= $large ) { # Perl 5.30までのバージョンではエラーになる
print "小さい順に並んでます\n";
}
```
不等号をはじめ、演算子には [優先順位](https://perldoc.jp/docs/perl/perlop.pod) があります。
上記の例の場合、以下のように解釈されます。
```perl
$small < $medium && $medium <= $large
```
---
## 論理演算子
### 3 つ以上の値を比較したい場合( Perl 5.30 以前)
```perl
$small < $medium <= $large
```
この 3 つ以上の値の比較は Perl 5.32 から導入されました。
<a href="https://perldoc.perl.org/perl5320delta#Chained-comparisons-capability">chained comparison</a> 、 **連鎖比較** とよびます。
Perl 5.30 以前では、連鎖比較を利用することはできません。下記のようなエラーとなります。
syntax error at sample.pl line 5, near "$medium <"
---
## 論理演算子
### 3 つ以上の値を比較したい場合(Perl 5.30 以前)
```perl
my $small = 10;
my $medium = 20;
my $large = 30;
if ( $small < $medium && $medium <= $large ) {
print "小さい順に並んでます\n";
}
```
Perl 5.30 以前では、連鎖比較を利用することはできないため、
```perl
$small < $medium && $medium <= $large
```
というように、論理演算子を使って 3 つ以上の値の比較を行なっています。
---
## 練習問題 `fizzbuzz_cmd.pl`
コマンドラインから入力された数字を判定して応答を返すプログラムを作りましょう
- 数字が 3 の倍数の時に `Fizz` と表示する
- 数字が 5 の倍数の時は `Buzz` と表示する
- 数字が 3 と 5 の倍数の時は `FizzBuzz` と表示する
- それ以外の数字の時は、その数字を表示する
```bash
$ perl fizzbuzz_cmd.pl 3
Fizz
$ perl fizzbuzz_cmd.pl 4
4
$ perl fizzbuzz_cmd.pl 5
Buzz
$ perl fizzbuzz_cmd.pl 15
FizzBuzz
```
---
## 出来た方は、Discord のテキストチャットで「出来た!」とリアクションお願いします!
---
## 休憩 & 質問 & 雑談 タイム<br>(5 〜 10 分)
---
# 配列
---
## 配列
### 配列とは
今まで学んできた変数はスカラー変数という、1 つの値のみを格納する変数でした。
例えば、小学校の 4 教科の平均点数を出すとき、$kokugo, $sansuu, $rika, $shakai と都度スカラー変数を 4 つ書いて計算するのは大変です。
そこで、「複数の値」や「複数のスカラー変数」をまとめて扱うことのできる **配列、配列変数** を紹介します。
---
## 配列
### 配列の作り方(右辺)
まずは、右辺に注目してください。
```perl
my @array = ( "foo", "bar", "baz" );
```
`( )` の中の `"foo"`, `"bar"`, `"baz"` それぞれを **要素** といいます。要素は `,` で区切られています。
右辺の要素の集まり `( "foo", "bar", "baz" )` の部分を **リスト** といいます。
このリストはスクリプトに書かれている通りの「要素の集合」でしかなく、要素を加えたり減らしたりすることができません。
---
## 配列
### 配列の作り方(左辺)
左辺に注目してください。
```perl
my @array = ( "foo", "bar", "baz" );
```
スカラー変数と同じく、初めてその配列を使うときは `my` で宣言します。
スカラー変数と同様に、代入演算子 `=` を使うことで、右辺のリストを左辺の配列に代入することができます。
配列は変数名の前に `@` をつけます。
`@` は `アレイ(array)`、 `@rray` 、と覚えるとよいでしょう。 (array は配列を意味する英単語です)
リストを配列に代入することで、要素を加えたり減らすことができるようになります。
---
## 配列
### 配列の展開
```perl
my @array = ( "foo", "bar", "baz" );
print "@array" . "\n"; # foo bar baz
```
配列はスカラー変数と同じく `" "` ダブルクォーテーションで囲むことで変数展開が可能です。
---
## 配列
### 配列の要素を利用する
配列の要素を利用する方法です。
```perl
my @array = ( "foo", "bar", "baz" );
print "$array[0]" . "\n"; # 1
```
配列 `@array` の最初の要素は `$array[0]` となります。
この時、シジルが配列を示す `@` からスカラー変数の `$` になっていることに注目してください。
これは **取り出す要素の数が 1 つだけなのでスカラー変数となる** ためです。
配列から複数の要素を取り出すときには **[スライス](https://perldoc.jp/docs/perl/5.16.1/perldata.pod#Slices)** を利用します。この時のシジルは `@` になります。Perl 入学式では説明しません。
---
## 配列
### 添字を使って要素を利用
配列から要素を利用する際には、 <ruby>**添字**<rt>そえじ</rt></ruby> を使います。
```perl
my @array = ( "foo", "bar", "baz" );
print "$array[0]\n"; # foo
print "$array[1]\n"; # bar
print "$array[2]\n"; # baz
```
配列の 1 つ 1 つの要素にアクセスする場合は `$変数名[添字]` を使います。
配列の添字は数字で指定します。配列の先頭(左側)の要素の添字は 0 となり、末尾(右側)に向けて 1 ずつ増えます。
| 添字 | [0] | [1] | [2] |
| --- | :-: | :-: | :-: |
| 要素 | "foo" | "bar" | "baz" |
---
## 配列
### 配列要素の添字
配列の添字には、数値が入ったスカラー変数を置くこともできます。
```perl
my @array = ( "foo", "bar", "baz" );
my $i = 1;
print "$array[$i]" . "\n"; # bar
```
---
## 配列
### 配列要素への代入
配列の要素に代入することも可能です。
```perl
my @array = ( "foo", "bar", "baz" );
$array[0] = "piyo"; # 先頭の要素に文字列 "piyo" を代入する
print "@array" . "\n"; # piyo foo bar
```
---
## 配列
### 配列要素への代入
配列に、別の配列の中身を追加することもできます。
```perl
my @array_one_two = ( 1, 2 );
my @array_numbers = ( @array_one_two, 3 );
print "@array_numbers" . "\n"; # 1 2 3
```
---
## 配列
### 配列要素の計算
配列の要素はスカラ変数と同じように扱うことが可能です。
```perl
my @array = ( 1, 2, 3 );
my $sum = $array[0] + $array[2]; # my $sum = 1 + 3
print "$sum\n" # 4
```
添字を利用して配列の要素同士で足し算をしています。
---
## 配列
### 配列の要素数
```perl
my @array = ( "foo", "bar", "baz" );
my $count_array_element = scalar @array; # 要素の数を取得
print "$count_array_element\n"; # 3
my $last_array_index = $#array; # 配列の末尾の要素の添字を取得
print "$last_array_index\n"; # 2
```
- `scalar` 関数の引数に配列を与えると、配列に格納されている **要素の個数** を取得できます。
- 配列`@array` に対して `$#array` と書くことで、配列に格納されている **末尾の要素の添字** を取得できます。
---
## 配列
### 範囲演算子
連続する数字を配列に格納するときは **範囲演算子** `..` が便利です。
```perl
my @array1 = ( 1 .. 5 );
print "@array1" . "\n"; # 1 2 3 4 5
```
- `1 .. 5` と書くことで、1 から 5 までの連続する値を配列に代入できます。
- ただし「左側の数値より右側の数値が大きい」必要があります。
```perl
my @array2 = ( 5 .. 1 );
print "@array2\n"; # (何も表示されない)
print scalar @array2 . "\n"; # 0
```
---
## 配列
ここまで、配列の中の要素を 1 つ取り出したり、代入する方法を紹介してきました。
しかし、配列で最もよく使われるのは **配列要素を、順番に「すべて」処理する** 処理です。
配列に格納された **すべての要素** に対して、繰り返し同じ処理をする方法をこれから紹介します。
---
## 配列
### for ループ
配列の要素を、順番に「すべて」処理する方法として、**for 文** があります。
```perl
my @array = ( "foo", "bar", "baz" );
for my $element (@array) {
print "$element\n"; # foo bar baz がそれぞれ改行されて表示される
}
```
この場合、変数 `$element` に 配列 `@array` の先頭から順番に要素が格納されていきます。
最初に `$array[0]`, `$array[1]`, `$array[2]` とスカラー値が順番に代入され、処理(print)が行われます。
---
## 配列
### for ループと範囲演算子
for 文と範囲演算子を組み合わせることで、決まった回数だけ処理を繰り返すことができます。
- カウントアップ
```perl
for my $i ( 1 .. 50 ) {
print "$i\n"; # 1 から 50 まで 1つずつ改行されて表示される
}
```
- 単なる繰り返し
```perl
for my $i ( 1 .. 50 ) {
print "Hello, World\n"; # Hello, World が 50回表示される
}
```
---
## 練習問題 `count_up.pl`
1 から 100 までの数字について、for 文を利用して 1 つずつ表示して改行する `count_up.pl` を作成しましょう。
`count_up.pl` の実行例
```
1
2
3
4
# 中略
100
```
---
## 練習問題 `fizzbuzz_for.pl`
1 から 100 までの数字について、以下のようなルールに従って表示を行う `fizzbuzz_for.pl` を作成しましょう。
- その数字が `3` で割り切れるなら `Fizz` と表示する。
- その数字が `5` で割り切れるなら `Buzz` と表示する。
- その数字が `3` でも `5` でも割り切れるなら `FizzBuzz` と表示する。
- その数字が `3` でも `5` でも割り切れないなら その数字 を表示する。
> コンピュータサイエンス学科卒業生の過半数にはそれ(fizzbuzz)ができないのだ<br> > [どうしてプログラマに・・・プログラムが書けないのか?](http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm)
---
`fizzbuzz_for.pl` の実行例
```
1
2
Fizz
4
Buzz
# 中略
14
FizzBuzz
16
# 中略
98
Fizz
Buzz
# 終了
```