• ベストアンサー

文字列にコントロール文字を含むと何ができるの?

プログラミングPerlを読んでいます。 ページをめくる速度が、すっごい遅いのですが・・・ やっとこさ74ページまできました・・・ 今回の疑問は文字列中にコントロール文字を埋め込むと何ができるの? というものです。 この疑問が浮かんだきっかけは このページでコントロール文字を表す正規表現が紹介されていたからです。 このような正規表現が用意されているということはコントロール文字を使用した文字列マッチを行うことを想定しているのだと思います。 すなわちコントロール文字を含んだ文字列を扱う場面が出てくるのだと思うのです。 このような文字列は、どのような場面で登場するのでしょうか。 また、どのような働きをするのでしょうか。 恐らく文字列を画面やプリンターへ出力するのと同時に、何か別の事柄を一緒に行うのではないかと予想しているのですが・・・ ちょっと気になったので質問しました。 どなたか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

> コントロール文字を表す正規表現 えーと手元にその本がないので(5.6時代のものなので 処分してしまった) 確かめられないのですけど、正規表現じゃなくて エスケープシーケンスとして解説されていませんか? まあそれはさておき、 \cX のような一般的な表記があるのは、言語デザイナーである Larry Wallの性格を反映したものだと思います。 つまり制御文字のような直接表記できない文字を表すのに (\nとか\r、\tなどを除外して) \033 とか \x1b とか書くことが 以前からできていたからです。 (UNIXでの)EOFはおっしゃるとおり ^D です。多分 Ctrl-D を連想するように \cD と書けたらわかりやすいよね。といった 経緯で導入されたんじゃないでしょうか。 で実際にどういうときに使うかですが、 たとえばテキスト処理を行うとして、いわゆる JISコードと呼ばれるような エンコーディングを使っているときには \c[ (\x1b, \033, \e)がテキスト中に現れます。 あとはWindowsのコマンドプロンプトでは 縁がありませんが、画面制御をするのにも この \c[ にあたる文字は使われます。

zyousuke
質問者

お礼

sakusaker7さん、ご返信ありがとうございます。 プログラミングPerlの正規表現の規則6:アトムの最後の所で次の解説文があります。 逆スラッシュの直後にcがあり、さらに1文字が続くもの(例えば\cD)は、対応するコントロール文字にマッチする。 また、45ページのエスケープシーケンスの一覧表には載っていませんでしたが ""中にコントロール文字をエスケープシーケンスとして記述できることを確認しました。 処分してしまったとはもったいない!! 私は、最新のプログラミングPerlが2冊構成になっているのを嫌い、わざわざヤフオクから旧版を取り寄せました^^ このようなコントロール文字の正規表現が用意された経緯や理由(の予想)は、興味深くためになりました。 そして、文字セットにJISコードを使用している場合には、このコントロール文字による文字列マッチにお目にかかるのですね。 あと、昨日ネットで調べたところユニックスではCtrlキーを押しながらJキーを押すと、Enterキーと同じ効果があることを知りました。 ですので次のコードを実行すると"マッチ\n"が表示できました。 $_ = " "; print("マッチ\n") if(/\cJ/); ようはパールお得意の、いろんな書き方ができるよ! という認識でいいですよね今は

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

今さら誰もやらないと思いますが, 「仮想的に 2次元 (以上の) 配列を作るためにハッシュを使う」という機能があります. このときに使うハッシュのキーには, 各次元の添字を区切るため通常コントロール文字が入ります. ... ということでいいのかなぁ?

zyousuke
質問者

お礼

ご返信ありがとうございます。 ハッシュ変数とコントロール文字を使用して仮想二次元配列を作成してみましたw キーはコントロール文字を含んだ文字列で構成されていますが、普通の文字列と同じように、何の問題もなく値を参照できました。 ・・・ということはパールで用意されている、コントロール文字を表す正規表現は、ハッシュ変数のキーを構成する文字列に対してマッチを行うときに使用することを想定しているのか!?? 私は、もっと長大な文字列に対してマッチを行うことを想像していたのですが、いかがでしょうか

すると、全ての回答が全文表示されます。
回答No.1

一例をあげます。(こんなものでよろしければ) 「文字列中に改行が含まれていた場合はそれを削除する」 などに使用されます。 たとへば、 $hoge =~ s/\n|\r|\n\r//; などとしますと、元の$hogeに含まれていた改行を削除したものが新しい$hogeとなります。

zyousuke
質問者

お礼

ご回答ありがとうございます。 でも私が思い描いているコントロール文字の正規表現とは \cD みたいなやつなのです。 これは入力を終了するときのDキーの正規表現だと思うのですが、 これを文字列中に含むことができ、また s/\cD//; というようにやってマッチに使うこともできるらしいのですが、 このようなコントロール文字が混じった文字列の用途を知りたかったのです。 (ちなみに私が知っているコントロール文字はCとDぐらいかな・・・)

すると、全ての回答が全文表示されます。