はじめに
Perlには範囲演算子という演算子..
が存在します。
同等なものはRubyやSwiftにもあるようです。
# 範囲演算子 -> ..
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つの範囲演算子はないのか?
実際に実行してみます。
# 範囲演算子? -> ...
foreach my $num (0...5) {
print "$num ";
}
$ perl example_three_dot_range.pl
0 1 2 3 4 5
なんとしっかり動いてくれます!
Perlにもドット3つの範囲演算子があったのでしょうか?
ドットをもっと増やすとどうなるのか?
ドットを4つに増やしてみます。
# 範囲演算子? -> ....
foreach my $num (0....5) {
print "$num ";
}
$ perl example_four_dot_range.pl
0
さてどういうことでしょうか?
更に詳しく見るために、ドットを5つに増やしてみます。
# 範囲演算子? -> .....
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では次のコードと同義になります。
# 0...5 == 0. .. 5
foreach my $num (0.0 .. 5) {
print "$num ";
}
# 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です。
foreach my $num (0. ... .5) {
print "$num ";
}
perl example_four_dot_range_with_space.pl
# 0
おわりに
こんなコードを書く人がいるとは思えませんが、小ネタとして受け取ってください!
もし何か気づいたこと、気になったことがあれば教えていただけると幸いです。