質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

4回答

6795閲覧

Perl: forとforeachの違い

UMA00

総合スコア18

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2016/10/09 11:51

###理解したいこと
Perlにおける、forとforeachの違いを知りたい。
###実行したプログラム

Perl

1for(my $i=0; $i<5; $i++){ 2# forをforeachとしても、結果は同じ。 3 print "$i\n" 4}

###試したこと
上記のように、ループ処理でforおよびforeachそれぞれを使用したものを実行してみました。結果は同じでした。ネットで調べても、「forとforeachは同じ」といった説明ばかりでした。
「名前が違うのに、役割も全く一緒というのはおかしいのでは?」と思い、こちらで質問致しました。
ご回答宜しくお願い致します。

(ちなみに、本当に名前のみ異なるのであれば、短い方の「for」を使用していきたいと思います!)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

Perlにおいて、forforeachは全く等価な構文です。
Perlの公式ドキュメントに以下のように書かれています。

The foreach keyword is actually a synonym for the for keyword, so you can use either.

また、質問における以下の疑問について。

「名前が違うのに、役割も全く一緒というのはおかしいのでは?」

PerlはモットーとしてTMTOWTDI(There's more than one way to do it)を掲げており、ひとつの目的に対して何通りものコードの書き方を持つように設計されています。
知らなければ不思議に思われるかもしれませんね。

投稿2016/10/09 12:33

carimatics

総合スコア740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UMA00

2016/10/09 12:43

ご回答、ありがとうございます! TMTOWTDI(ティムトゥディ)はPerlのモットーなのですね。 同じ結果に対して様々なアプローチができる、ということ自体は良いことだと思います。 調べてみると、Rubyなど他の言語でもその思想が受け継がれているようですね。一方で、学習コストを無駄に増やすだけだと言って、切り捨てている言語(Pythonなど?ですかね)もあるようです。こういうことを調べてみると、言語によっていろいろと個性があって面白いですね!
guest

0

「名前が違うのに、役割も全く一緒というのはおかしいのでは?」

はい、Perlだとforとforeachに互換性がありますね。
(内部でforに変換したりしてるらしいですが)

(長文を書いてる内に解決済みになってしまいしたが、
いちおう参考のために投稿しますね。)


しかし、特定の言語を離れた設計レベルで、
「for」と「(for)each」の違いを考えてみます。

この違いは個人的な考察で、統一見解とかではないですが、
役割の違いを考えるための参考として聞いてください。

「for」は命令的で、「(for)each」は宣言的、という違いがあります。
後者はオブジェクト指向でいうイテレータ(パターン)の考え方です。

前者は「10回繰り返せ」とか、外部から手続きを命令します。
後者は「配列の要素を走査せよ」とか、メッセージを送ります。

この違いは、前者では外部から回数を指示するのに対して、
後者では繰り返しの回数が5回か10回か100回は、
オブジェクトの内部状態に従って変わることです。

すなわち、前者は繰り返しの回数を知っている責務はforを使う側にありますが、
後者ではeachを依頼された側に責務があります。オブジェクトが自分で知っています。

後者は何がメリットかというと、データ構造の内部変化などの影響を受けないのです。
これは「配列の要素数が自動で指定できて便利だ」くらいの認知をよくされてます。

しかし、自分で独自にイテレータを作ると、データ構造の持ち方も、
走査の仕方も自由(逆にしたり1つおきにしたり)なので、意味がよく分かります。

あと、Rubyだとイテレータの仕組みが充実しているので、
こういうことに気づきやすい言語環境があります。

投稿2016/10/09 12:43

LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UMA00

2016/10/09 13:01

詳しいご説明、ありがとうございます! 私のレベルからすると結構レベルの高い内容かと思うのですが、非常に分かりやすく、納得できました!! 要するに、「外側から指定する」のか「内側で決める」のか、という違いがあるということでしょうか。そして、外側から指定する場合は ・自分で方法をいろいろと弄ることができる というメリットが、内側で決まる場合には ・自動で要素数を指定できる というメリットがあるのですね。 まだまだ初心者なので、直感的に「◯◯回繰り返して!」と指示を出せる命令型のforを使う方が楽(?)な気がします。でも、影響範囲などいろいろ考え始めるとforeachの方が良いのでしょうね!
guest

0

まったくわからないですが、興味があったので調べてみたところ、これあたりが違いなのかなと感じました。
参考にならないかもです。

perlで配列内を全てスキャンする場合はfor文よりforeach文でパフォーマンスアップ - Yahoo!知恵袋
perlsyn - Perl の文法 - perldoc.jp
お気楽 Perl プログラミング超入門

投稿2016/10/09 12:24

toutou

総合スコア2050

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UMA00

2016/10/09 12:48 編集

ご回答ありがとうございます! 最初のリンク先の「for文ではスクリプトレベルで動作している命令がforeachでは内部のバイナリ形式で動作しています。」というのが興味深い説明でした。私はまだ、処理速度にこだわる程のレベルまで達していないのですが、今後大量の情報を扱う場合などの案件を任されたときに役立ちそうです!
guest

0

forの繰り返しは、質問者様のご記載の通り、
変数が指定された数になるまでくり返すときによく使われます。

foreachは、リストなどの中身を取り出すときに使われたりします。

lang

1my @list = ("A", "B", "C"); 2 3foreach my $name (@list){ 4 print "$name¥n"; 5} 6 7#出力結果↓ 8#A 9#B 10#C

投稿2016/10/09 11:55

編集2016/10/09 11:57
nnahito

総合スコア2004

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UMA00

2016/10/09 12:51

ご回答ありがとうございます! コメント頂いたコードなんですが、やはりforeachをforにしても同じ結果となりました…(ちなみに、バージョンは5.16.2です)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問