Perl範囲演算子の不思議

劇場用3Dアニメーション「ドットハック セカイの向こうに」 予告篇

3Dアニメ映画「ドットハック セカイの向こうに」 (2012)

そろそろ.hackシリーズも見ていこうと思ってます。全部見た頃に感想更新します。

ドットをつなげて、..と書くと、範囲指定子になりますね。Rubyだと(1..10)、Bashだとブレース展開で{1..10} 。
今回は、Perlで..使います。

takk@deb9:~$ perl -E 'say "a".."z"'

こうすると当然、

takk@deb9:~$ perl -E 'say "a".."z"'
abcdefghijklmnopqrstuvwxyz
takk@deb9:~$ 

アルファベットのa~zまで表示されますね。

では$_に入れてから表示するとどうなるでしょう。

takk@deb9:~$ perl -E '$_="a".."z";say'
1E0
takk@deb9:~$ 

あら不思議。アルファベットが表示されません。
まあPerlを知ってる人から見ると当然ですね。代入する変数が間違っています。$_ではなく、@_;

範囲演算子..は、foreachで繰り返し処理を見るとわかりますが、配列となります。

takk@deb9:~$ perl -E 'foreach("a".."c"){say}'
a
b
c
takk@deb9:~$ 

どうしてもスカラーとして代入したいときは、配列の添字が必要です。

takk@deb9:~$ perl -E '$_= ("a".."z")[25];say'
z
takk@deb9:~$ 

最初のコマンドに戻ります。
$_を@_に入れ替えれば、正しく表示されます。

takk@deb9:~$ perl -E '@_=("a".."z");say @_'
abcdefghijklmnopqrstuvwxyz
takk@deb9:~$ 

配列なので””で囲むと、一つずつ区切られて表示されます。

takk@deb9:~$ perl -E '@_=("a".."z");say "@_"'
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
takk@deb9:~$

コメント

タイトルとURLをコピーしました