• ベストアンサー

ファイルハンドルについて

よく見かける例として、下記のような形があります。 open(FILE, "filepath") open('FILE',"filepath") ファイルハンドルを''でくくるケースとくくらないケースの意味は、なぜそうしてるのでしょうか。 短くかけるものは短く・・・の思想はわかるのですが、同じスクリプト内で2つのケースを 見かける場合、たまたまシングルクォートで閉じていないのか面倒だからなのか等、 どのような理由でそうなっているのかをご存知の方、ご教授願えませんでしょうか。

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

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 Perl では、ごく短いセンテンスは '' で囲っていなくても文字列として扱ってくれるからです。  オブジェクト指向に慣れた現代のプログラマーには、「ファイルハンドルはオブジェクトである」という感覚があります。  こう捕らえることで、「自分がファイルをつかんでいるのだ」というイメージを明確にするわけです。  ところがそれを '' でくくってしまうと、「ファイルハンドルは単なるトリガーである」というイメージになってしまいます。  つまり、「ファイルの入出力をつかさどっているのはあくまでも Perl のシステムで、自分はそれを使わせてもらっているだけ」というイメージになってしまうのです。  これは「システムを操りたい」という気持ちの強いプログラマーにとっては非常に座りの悪いイメージであり、できれば避けたいものであるのです。  ゆえに、「ファイルハンドルはトリガーではない」と思い込むためにわざと '' を書かないのです。  もちろん、ファイルハンドルに文字列を使うというシステムは他の言語ではあまり見かけないものなので、あとで誰かがトレースしたとき、その人を混乱させないようにという配慮でもあります。

taku0
質問者

補足

そうでしたか。そのような意図があっての事なのかもしれないんですね。 私が気にしたのは、 open(FILE, "$filepath") は下記と同一みたいですが、 open(FILE, "<$filepath") ファイルハンドルである FILEに対して私の認識しえない方法でダイレクトOSコマンドインジェクション脆弱性が存在するのかなぁ・・・と気になってしまったのですが、お答えいただいた意図とは別にセキュリティの観点からは、''で囲まなくても問題はないのでしょうか?

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

""でくくらないものはベアワードといって、文字列扱いになりますが、 ファイルハンドルとして評価される部分にベアワード(シンボル)を置いた場合は、ファイルハンドルとして扱われます。 Perlでは、ファイルハンドルとしてシンボルを使うのが一般的だと思います。 ファイルハンドルの替わりに、文字列を使用した場合は、文字列によるシンボリックリファレンスとして扱われます。 Perlでは、ファイルハンドルを書くべき所に、文字列を書くのはあまりないと思います。 そうする理由(""で囲む)は、よくわかりません。 むしろ変数にする場合は意味があると思いますが。 "<filepath" と "filepath" は、同じくファイルを読み取りモードで開くことを意味します。 リダイレクトを連想させる書き方ですが、リダイレクトとは関係ありません。 open(FH, "<", "filepath"); とも書けます。

taku0
質問者

お礼

詳しくご説明頂きまして有難うございます。 なるほどですね。よく分かりました。 open(FH, "<", "filepath"); という風にも書くことができるんですね。 有難うございます

noname#25358
noname#25358
回答No.2

 Perl は、   FILE   'FILE'   "FILE"  これらを、「FILE という文字列」として扱い、意味は全く同じになります。  OSに対してダイレクトに云々、といったもんじゃないですよ。(OSにダイレクトアクセスする場合、関数を区別することで使い分けます)  open() 関数の挙動自体は何も変化しませんので、セキュリティの問題は発生しません。

taku0
質問者

お礼

色々とご教授頂きまして有難うございます。 そうですよね FILE 'FILE' "FILE" は文字として扱い、意味は同じ。。なんですよね。 そうなんですけども、サニタイジングを施していたとしても、外部からGETorPOST又はapacheの設定やファイヤーウォールを通過するパケットなど何かしらのバグを突いて FILE = )last; command  等をされたりする事とかもあるのかなぁ・・・など考えてしまいました。(それが可能なら何でもできてしまうんでしょうけど・・) 初心者ゆえのセキュリティについてを意識してしまったが為に迷いの思考から抜けられずに居る所でした。 これで一つ胸のつっかえが取れた感じです。 有難うございました。