2008年05月25日 01:15 [Edit]

perl - 配列を1番目からはじめてみる

camel 配列の先頭要素が「0番目」であることは気持ち悪いか…「N番目」という言葉を考察してみる - ’(rubikitch wanna be (a . lisper))
JavascriptやPHPの配列や関数などで 配列の最初の要素がary[0]に格納されたりsubstring()関数の起点がゼロであったりしますが ゼロでなく1ではダメなのでしょうか。個人的.. - 人力検索はてな

C言語、Ruby、Lispなど多くの言語では配列は0起点である。つまり、先頭の要素のインデックスは0である。

小飼弾のアルファギークに逢ってきた」でも、インタビューは#0からはじまっているのだけど、これを自由に設定できてしまう類い稀なる言語が存在する。

perlだ。


あまり知られていない特殊変数$[に整数をセットすると、それが配列の起点となる。

[codepad]
my @ary = (0..7);
print "\$ary[$_] = $ary[$_]\n" for (0..7);
{
  local $[ = 1;
  print "\$ary[$_] = $ary[$_]\n" for (1..8);
}
perldoc perlvar
$[     The index of the first element in an array, and of the first
       character in a substring.  Default is 0, but you could
       theoretically set it to 1 to make Perl behave more like awk (or
       Fortran) when subscripting and when evaluating the index() and
       substr() functions.  (Mnemonic: [ begins subscripts.)

       As of release 5 of Perl, assignment to $[ is treated as a
       compiler directive, and cannot influence the behavior of any
       other file.  (That’s why you can only assign compile‐time
       constants to it.)  Its use is highly discouraged.

       Note that, unlike other compile‐time directives (such as
       strict), assignment to $[ can be seen from outer lexical scopes
       in the same file.  However, you can use local() on it to
       strictly bind its value to a lexical block.

見てのとおり、Its use is highly discouraged.とある。よいこは使わない方がよいだろう。a2p(awkスクリプトをperlに翻訳するプログラム;perlをインストールするともれなく付いてくる)以外に用途不明ではあるが、$へえ++ぐらいにはなるかも知れない。

Dan the Perl Monger


この記事へのトラックバックURL

この記事へのトラックバック
ref: perl - 配列を1番目からはじめてみる ref: 配列の先頭要素が「0番目」であることは気持ち悪いか…「N番目」という言葉を考察してみる - ’(rubikitch wanna be (a . lisper)) ref: JavascriptやPHPの配列や関数などで 配列の最初の要素が.. - 人力検索はてな ruby も自
[Ruby] ruby - 配列を1番目からはじめてみる【まめめも】at 2008年05月25日 01:59
最近とんと見なくなったFortranさんですがしまいには JavascriptやPHPの配列や関数などで 配列の最初の要素がary[0]に格納されたりsubstring()関数の起点がゼロであったりしますが ゼロでなく1ではダメなのでしょうか。個人的.. - 人力検索はてなと質問され 配列の
[Dope]先頭要素が「1番目」であるFortran【@author pyridoxin】at 2008年05月25日 04:45
この記事へのコメント
FORTRAN77の配列の一番目は指定しなければ、1です。
DIMENSION A(5) は、DIMENSION A(1:5) と同じです。
Fortran90の配列の一番目も指定しなければ、1です。
real, dimension(10)::a は、real, dimension(1:10)::a と同じです。
FORTRAN77もFortran90も配列の添字の下限を指定できます。
「類い稀なる言語」にFORTRANも入れてください。
Posted by 林 at 2008年05月25日 08:18
Perlの$[についても回答に書いてあるじゃん。この記事の日付より前の。
BASICのOPTION BASEも。
Posted by 774 at 2008年05月25日 10:20
"番目" ってゆーと、1 オリジンが自然なように思えますので、私はオフセットとインデックスは別だと理解するようにしてます。
Posted by Tommy at 2008年05月25日 10:24
BASIC も optionbase ステートメントがあるのですが、VB.net では optionbase 無くしたのか。
Posted by ■□ Neon / himorogi □■ at 2008年05月25日 10:50
リトマス試験紙に使えそうですね
Posted by おっさん at 2008年05月25日 12:23
Pascalも指定できましたね。たしか。

var foo : array[1..10] of integer;
var foo : array[-10..0] of integer;
Posted by kawa at 2008年05月25日 13:46
最初は気になったけど、今はむしろ0から始まってくれる方が気持ちがいい。
Posted by taka.BRK at 2008年05月27日 13:50