LoginSignup
11
0

More than 1 year has passed since last update.

Perlの範囲演算子はどこまで伸ばせるのだろうか?

Last updated at Posted at 2018-04-17

はじめに

Perlには範囲演算子という演算子..が存在します。
同等なものはRubyやSwiftにもあるようです。

example_two_dot_range.pl
# 範囲演算子 -> ..
foreach my $num (0..5) {
    print "$num ";
}
実行結果
$ perl example_two_dot_range.pl
0 1 2 3 4 5 

Rubyには、上記のドット2つの範囲演算子に加えて、ドット3つの範囲演算子...もあります。
Swiftの場合、ドット3つの範囲演算子...と、ドット2の範囲演算子に不等号を加えた演算子..<(どちらも区間演算子の一種)があります。

それぞれの言語において、ドット2つの範囲演算子とドット3つの範囲演算子は挙動が異なります。

参考サイト
- class Range (Ruby 2.5.0)
- swift - 範囲演算子 コレ→「...」

しかしPerlにはドット3つの範囲演算子は存在しません。

本当にPerlにはドット3つの範囲演算子はないのか?

実際に実行してみます。

example_three_dot_range.pl
# 範囲演算子? -> ...
foreach my $num (0...5) {
    print "$num ";
}
実行結果
$ perl example_three_dot_range.pl
0 1 2 3 4 5 

なんとしっかり動いてくれます!
Perlにもドット3つの範囲演算子があったのでしょうか?

ドットをもっと増やすとどうなるのか?

ドットを4つに増やしてみます。

example_four_dot_range.pl
# 範囲演算子? -> ....
foreach my $num (0....5) {
    print "$num ";
}
実行結果
$ perl example_four_dot_range.pl
0 

さてどういうことでしょうか?

更に詳しく見るために、ドットを5つに増やしてみます。

example_five_dot_range.pl
# 範囲演算子? -> .....
foreach my $num (0.....5) {
    print "$num ";
}
実行結果
$ perl example_five_dot_range.pl
syntax error at example_five_dot_range.pl line 2, near "....."
Execution of example_five_dot_range.pl aborted due to compilation errors.
exit status 255

さすがにドット5つの範囲演算子はないようです。

ネタばらし

シンタックスハイライトがある場合はバレバレなのですが、ドット3つとドット4では次のコードと同義になります。

example_not_three_dot_range.pl
# 0...5 == 0. .. 5
foreach my $num (0.0 .. 5) {
    print "$num ";
}
example_not_four_dot_range.pl
# 0....5 == 0. .. .5
foreach my $num (0.0 .. 0.5) {
    print "$num ";
}

つまり、ドット3つの場合は0.0から5まで、ドット4つの場合は0.0から0.5までを表していたのです。

そのため、ドット3つの場合は0 1 2 3 4 5であり、ドット4つの場合は0だけだったのです。

ちなみに

... という演算子自体は、Perlに存在します。
https://perldoc.jp/docs/perl/perlop.pod#Range32Operators

しかし、構文解析の問題か、 . を繋げた状態ではエラーとなってしまいます。
その証拠に、ちゃんと離したら理解してくれました。
perlのバージョンはv5.34.0です。

example_five_dot_range_with_space.pl
foreach my $num (0. ... .5) {
    print "$num ";
}
実行結果
perl example_four_dot_range_with_space.pl
# 0 

おわりに

こんなコードを書く人がいるとは思えませんが、小ネタとして受け取ってください!

もし何か気づいたこと、気になったことがあれば教えていただけると幸いです。

11
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
0