Perl Perl_0
Perl 「 reverse 演算子 」でリストデータを逆順にする (0x29)

Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x29 回。
Perl で、リストデータの並びを逆順にする reverse 演算子について。
reverse 演算子の書式
Perl の「 reverse 」演算子は、リストデータの並び順の前後を入れ替えます。読み方はそのまま「 リバース 」で良いと思います。
reverse 演算子の書式はいたって簡単です。
reverse LIST
「 LIST 」はリストデータを表すので、配列変数を指定することも可能です。
コンテキストによる動作の違い
reverse 演算子のコンテキスト (文脈) による動作の違いは興味深いです。
「 Perl リストデータ の 代入 (スカラ変数) (0x1f) 」で触れた様に、Perl のコンテキストは、「 スカラコンテキスト 」と「 リストコンテキスト 」に分けられます。
「 スカラ (Scalar) 」は単数の、「 リスト (List) 」は複数のデータを意味することを「 Perl スカラ変数 (0x06) 」で確認しました。
Perl に組み込まれた多くの演算子や関数は、その振る舞いがコンテキストに左右されます
reverse 演算子の場合、リストコンテキストで LIST を構成する要素を逆順に並べ替えを行います。これが標準の動作です。スカラコンテキストでは、LIST の要素を「 連結 」して、1 文字ずつ逆順にします。
コンテキスト毎の動作確認 (リストコンテキスト)
reverse 演算子が置かれた文脈は、通常リストコンテキストと解釈されます。例えば次の様になります。
@hello = reverse "world", "Hello,"; # reverse
print "@hello\n"; # Hello, world
リストデータとして reverse に渡された、2 つの要素の順序が入れ替わっています。この他には以下の様な例があります。
@side = 1..8;
@orbit = reverse (@side); # 8, 7, 6, 5, 4, 3, 2, 1 の順
@orbit = reverse @side; # ( ) は省略可能
@orbit = reverse 1..8; # 2 行目と同等
@side1 = reverse "shangrila", "sweetwater", "londenion"; # "" を使ったリストリテラル
@side1 = reverse @side1; # 元の配列を逆順で上書き
2 行目と 6 行目では範囲演算子「 .. 」の弱点を補っています。範囲演算子「 .. 」の弱点とは値を増加することしか出来ないことです。
10 行目の例は、配列 @side1 に reverse 演算子を働かせて元の配列 @side1 に代入しています。reverse 演算子は、引数のリストデータそのものは変更しないので、特定の配列変数の要素を逆順にしたい場合はこの様にします。
コンテキスト毎の動作確認 (スカラコンテキスト)
reverse 演算子を使うと、それはリストコンテキストだと判断されます。この様な演算子をスカラコンテキストで使うには「 scalar 」という演算子を使います。
scalar 演算子は、リストコンテキストの文脈を強引にスカラコンテキストに出来ます。
次の例では、scalar 演算子でスカラコンテキストを演出しているため、要素の入れ替えではなく、要素を連結した上で、1 文字ずつ並び替えを行います。
print scalar reverse "dlrow ,", "olleH"; # Hello, world
また、reverse 演算子は、スカラコンテキストに限り、定義済みのスカラ変数「 $_ 」を利用することが出来ます。
$_ = "\ndlrow ,olleH";
print reverse; # リストコンテキスト
print scalar reverse; # スカラコンテキスト
2 行目の print 文はリストコンテキストであるため何も出力されませんが、スカラコンテキストの 3 行目では、定義済みのスカラ変数「 $_ 」を暗黙的に利用します。
0x29 -> 0x2a へ
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x2a) へ続く。
過去記事 RSS
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)