ActivePerlの初心者ですが基本的なことが分からないので教えてください。
まだ覚えたばっかりで1行入力でいろいろ書式を入力して確認しながら覚えているのですが
例えば、ネット上に
各行の最初の10文字を捨てる
perl -lne 'print substr($_, 10) = ""' file
というようなサンプルが記述されているのですが
実際に入力してみると
「Can't find string terminator "'" anywhere before EOF at -e line 1.」
というようなエラーが出ます。
どうも ' が使えないようなのですが
なぜエラーになるのかがよく分かりません。
この原因が分からないので試行錯誤で ' を " で行ったりして
エラーを回避しながら確認しているのですが
上記のように ' と ' の中にさらに " と " がある場合には
どのように回避したらよいのかがよく分かりません。
上記のような例の場合にはどのように入力すれば
エラーが出なくなるのでしょうか。
No.1
- 回答日時:
この例だけについて言えば, 一番簡単なのは
perl -lne "print substr($_, 10) = ''" file
じゃないかな.
わざわざ「『ActivePerl の』初心者」と書いているくらいだから, 「AcrivePerl の」でない部分は完璧なんだよね? この辺は余裕でわかっていいと思うんだけどなぁ.
エラーはでなくなりました。
ありがとうございます。
各行の最初の10文字を捨てるということなので
各行の11文字目から行の終わりまでが表示されるのかと思っていましたが
空白の行が表示されています。これはこれで正しいのかな?
No.2ベストアンサー
- 回答日時:
perl -e 「スクリプト」
と実行するときに、コマンド全体は実行する環境に従います。変数の置換とか、特殊文字の処理は、この段階で行われます。
そうして完成した「スクリプト」の内容はPerlの文法に従います。
「スクリプト」を一つの引数として解釈させる方法は、環境依存です。
Windowsから実行する場合は、コマンドプロンプトの仕様に従うことになります。
空白等を含む文字列を ' で括ってその文字として扱う、というのは、Unix系シェルでの機能です。
Windowsでは、' にそのような意味はありません。
スクリプト中に"" (ダブルクォート2つ)は、Perlの文法に従うので、Perlで同じ意味を持つ別の表現に置き換えることができます。
ということなので
・' ではなく、全体を " でくくる。Windowsの仕様
・" 中に " を書きたいときは、 \" 等とする。Windowsの仕様
・あるいは、今回の場合なら、Perl上では "" と '' は同等なので、スクリプト中では '' を使う
ということになります。
コマンドプロンプトの仕様を確認しようと検索したところ、次のようなサイトがありました。
http://d.hatena.ne.jp/thinca/20100210/1265813598
これを見ると、WindowsでPerlのワンライナーやろうとすると、大分面倒なことになりそうです。
外側は" "で、内側は' 'か"を\でエスケープした\" \"にすることで、何とか正しく実行することができるようになりました。その後、いろいろ確認していて、' 'ではその中の変数や\nなどが展開されないけれども、\" \"では展開されるなど、その挙動に少し違いのあることが少しずつではありますが分かってきました。ありがとうございました。
No.3
- 回答日時:
> print substr($_, 10) = "";
これは 「substr($_, 10) = ""」 の評価結果を出力する、という意味になります。
「substr($_, 10) = ""」 の評価結果、ということは、 = 演算子の評価結果、ということになります。
A = B の評価結果は、 Bの値(を代入したAの値)になります。
よって、この式の評価結果は "" です。
つまり、 print "" ; を実行していることになります。
-l による行末処理によって print "" . "\n" ; と同様の意味になります。
以上のことより、空行が表示される、というのが、書いた通りに正しく動作した結果です。
なお、=""以降が無ければ、「各行の11文字目から行の終わりまで」です
="" で、それを削除しているので、$_に残っているのは、先頭の10文字です。
http://perldoc.jp/func/substr
substr($_, 10) = "" の評価結果が "" なので "" がprint されているということがよく理解できました。また、-lスイッチの意味も調べていたのですが、行末処理の意味がよく分かりませんでしたが、行末に"\n"が追加されるということも分かりました。 とても分かりやすい説明をしていただきましてありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 銀行・ネットバンキング・信用金庫 イオン銀行に初回ログインできない 2 2022/03/31 21:15
- HTML・CSS <input>のstep属性に違反する入力をした時にエラーメッセージを表示させない事は可能か 2 2023/02/16 04:11
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- Java コンソールから所属財産を入力(単位:万円 1000~100000以内でIntegerに変換できない場 2 2022/05/31 21:32
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- UNIX・Linux bash環境でのエラー対応をお願い致します。 1 2022/11/26 17:41
- プリンタ・スキャナー キャノンmp490プリンター【エラー番号5400】で【プリンタートラブルが発生しました。電源を入れ直 2 2023/07/24 17:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl の外部モジュールの利用方法
-
ファイルアイコンの左下に緑の□...
-
perlのプログラミング 部分入れ...
-
ペプシコーラとコカ・コーラとD...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
-
perlについての質問
-
Blenderについて
-
perl このテキストファイルを簡...
-
Perlでファイルの末尾から指定...
-
秀丸での一括変換について
-
英数文字列のうちの数値を4桁に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
bashのgrepで複数の検索、かつ...
-
エラー
-
Pod::Usageで日本語を使用する...
-
perlでactive directoryに登録
-
perlスクリプト s/^\\s+//; ...
-
perl+shiftjisで5c文字化けの対...
-
実行時パラメータを使用するとE...
-
UTF-8で書かれたHTMLファイルを...
-
XML::XPathで日本語検索するには
-
メールフォームからの受信メー...
-
何時間後を求める。
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
例外処理のフローチャートの記...
-
ArduinoのジャイロモジュールMP...
-
ユーザー定義関数に#NAME?が返...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
おすすめ情報