• ベストアンサー

ActivePerl 1行入力で 'と"がある場合

ActivePerlの初心者ですが基本的なことが分からないので教えてください。 まだ覚えたばっかりで1行入力でいろいろ書式を入力して確認しながら覚えているのですが 例えば、ネット上に 各行の最初の10文字を捨てる perl -lne 'print substr($_, 10) = ""' file というようなサンプルが記述されているのですが 実際に入力してみると 「Can't find string terminator "'" anywhere before EOF at -e line 1.」 というようなエラーが出ます。 どうも ' が使えないようなのですが なぜエラーになるのかがよく分かりません。 この原因が分からないので試行錯誤で ' を " で行ったりして エラーを回避しながら確認しているのですが 上記のように ' と ' の中にさらに " と " がある場合には どのように回避したらよいのかがよく分かりません。 上記のような例の場合にはどのように入力すれば エラーが出なくなるのでしょうか。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

perl -e 「スクリプト」 と実行するときに、コマンド全体は実行する環境に従います。変数の置換とか、特殊文字の処理は、この段階で行われます。 そうして完成した「スクリプト」の内容はPerlの文法に従います。 「スクリプト」を一つの引数として解釈させる方法は、環境依存です。 Windowsから実行する場合は、コマンドプロンプトの仕様に従うことになります。 空白等を含む文字列を ' で括ってその文字として扱う、というのは、Unix系シェルでの機能です。 Windowsでは、' にそのような意味はありません。 スクリプト中に"" (ダブルクォート2つ)は、Perlの文法に従うので、Perlで同じ意味を持つ別の表現に置き換えることができます。 ということなので ・' ではなく、全体を " でくくる。Windowsの仕様 ・" 中に " を書きたいときは、 \" 等とする。Windowsの仕様 ・あるいは、今回の場合なら、Perl上では "" と '' は同等なので、スクリプト中では '' を使う ということになります。 コマンドプロンプトの仕様を確認しようと検索したところ、次のようなサイトがありました。 http://d.hatena.ne.jp/thinca/20100210/1265813598 これを見ると、WindowsでPerlのワンライナーやろうとすると、大分面倒なことになりそうです。

fs3yjmo
質問者

お礼

外側は" "で、内側は' 'か"を\でエスケープした\" \"にすることで、何とか正しく実行することができるようになりました。その後、いろいろ確認していて、' 'ではその中の変数や\nなどが展開されないけれども、\" \"では展開されるなど、その挙動に少し違いのあることが少しずつではありますが分かってきました。ありがとうございました。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> print substr($_, 10) = ""; これは 「substr($_, 10) = ""」 の評価結果を出力する、という意味になります。 「substr($_, 10) = ""」 の評価結果、ということは、 = 演算子の評価結果、ということになります。 A = B の評価結果は、 Bの値(を代入したAの値)になります。 よって、この式の評価結果は "" です。 つまり、 print "" ; を実行していることになります。 -l による行末処理によって print "" . "\n" ; と同様の意味になります。 以上のことより、空行が表示される、というのが、書いた通りに正しく動作した結果です。 なお、=""以降が無ければ、「各行の11文字目から行の終わりまで」です ="" で、それを削除しているので、$_に残っているのは、先頭の10文字です。 http://perldoc.jp/func/substr

fs3yjmo
質問者

お礼

substr($_, 10) = "" の評価結果が "" なので "" がprint されているということがよく理解できました。また、-lスイッチの意味も調べていたのですが、行末処理の意味がよく分かりませんでしたが、行末に"\n"が追加されるということも分かりました。 とても分かりやすい説明をしていただきましてありがとうございました。

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

この例だけについて言えば, 一番簡単なのは perl -lne "print substr($_, 10) = ''" file じゃないかな. わざわざ「『ActivePerl の』初心者」と書いているくらいだから, 「AcrivePerl の」でない部分は完璧なんだよね? この辺は余裕でわかっていいと思うんだけどなぁ.

fs3yjmo
質問者

お礼

エラーはでなくなりました。 ありがとうございます。 各行の最初の10文字を捨てるということなので 各行の11文字目から行の終わりまでが表示されるのかと思っていましたが 空白の行が表示されています。これはこれで正しいのかな?

関連するQ&A