プロが教えるわが家の防犯対策術!

プログラムPerlの超初心者です。

プログラムで「$path0」をまず設定していて、「path0以下で『W・・・』というフォルダ名があったら「path1」として「path0+\+dname」と設定したいのです。(以下のように書きました)
foreach $dname ( @dlist ){
if( $dname=~/W/ ){
$path1=$path0.”\".$dname;
  print( "$path1\n" );

しかし、『$path1=$path0.”\".$dname;』ここで「Can't find string terminator "'" anywhere before EOF at ****.pl line **.」とエラーメッセージが出ました。
どう直せばいいでしょうか?
分かりにくくて申し訳ないのですが、教えていただけるとありがたいです。

質問者からの補足コメント

  • うーん・・・

    今、回答いただいた方々ありがとうございます。
    「kmee様」が細かく教えていただいているのですが、新たに質問ですがWindowsの場合『¥』と『/』どっちを使うといいのでしょうか?

    それからダブルオーテーションではなくシングルオーテーションを使用する場合ただ単にダブルのところをシングルに変えればいいのですかね?

    あまりにも初心者過ぎて申し訳ないのですが、よろしくお願いします。

      補足日時:2021/12/04 17:30

A 回答 (7件)

○「 ・' (シングルクオーテーション/引用符) を使って、\ による展開をしないようにする」


は間違いでした。
他の文字だと展開されないのですが、\'が展開されるのを失念していました。

参考)
https://perldoc.jp/docs/perl/5.30.0/perldata.pod
> ダブルクォートの文字列リテラルでは、バックスラッシュの置換と 変数の置換が行なわれ、
> シングルクォートの文字列では、 (\' と \\を除いて)これらの置換は行なわれません。
(= シングルクォートの文字列では \' と \\ を展開する)


○ 「Windowsの場合『¥』と『/』どっちを使うといいのでしょうか?」

バックスラッシュとスラッシュを書き間違えたものだと思い、
円記号とバックスラッシュについての質問と解釈して、
#4のように回答しました。


「Windowsの場合
**パスの区切り文字として**
『¥』と『/』どっちを使うといいのでしょうか?」

という意味でしたら、
・下記のような点を考慮して、便利な方を使う。
 \と/の変換が必要か?必要ならどれくらいの量か?
 プログラム中に何度パス区切り文字を書く機会があるのか?
 共同制作者の方針
 使用するモジュールの仕様

・私個人で作るなら、(上記のような点が考えずに) スラッシュをベースにプログラムを作り、必要な箇所でバックスラッシュとの置換を行う
    • good
    • 0
この回答へのお礼

何度も何度も回答いただきありがとうございました。

お礼日時:2021/12/06 15:23

パス名を組み立てるなら, Perl に限って言えば


File::Spec
を使う手もあるけどね. パスの区切りに ':' を使う OS だって想像できないわけじゃないから, これが「一番ポータブル」といえるかもしれない, Perl に限れば.
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2021/12/06 15:24

ダブルクォートの中で \ は特殊な意味を持つけど, シングルクォートの中でも特別な意味を持つ場合があって, 今のケースではその「特別な意味を持つ場合」になってしまうので単純に


"\" を '\' に置き換えればいい
というものではない (実際にやればわかるがシングルクォートにしてもエラーが出るはず). なので, "\\" または '\\' のどちらかにしないといけない.

で, Windows は「コマンドプロンプトのレベル」では / と \ を区別しているんだけど, 内部的には / でも \ でもパスの区切りとみなしている. なので, コマンドプロンプトレベルと内部レベルとを使い分けられるなら, Windows であっても / を使うほうがいいんじゃないかなぁと個人的には思う.

ついでに指摘しておくと「$dname=~/W/」という条件では「『W・・・』というフォルダ名」にはならないよ. あと foreach の変数は可能なら my をつけて宣言すべきだし, 自分なら foreach で grep 使ってしまうなぁ.
    • good
    • 0

https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83 …

バックスラッシュは、左上から右下への線で、
スラッシュ(右上から左下への線)とは別の文字です。
使い方も違います。

円記号とバックスラッシュは(フォントやソフトによっては)同じ文字です。

> Windowsの場合『¥』と『/』どっちを使うといいのでしょうか?

「キーボードの円記号を押して表示される文字」を使ってください。
/ (スラッシュ)で代用はできません。


> それからダブルオーテーションではなくシングルオーテーションを使用する場合ただ単にダブルのところをシングルに変えればいいのですかね?

はい。
    • good
    • 0

追記。


エラーメッセージを読むようにしましょう

「Can't find string terminator "'" anywhere before EOF」
""の文字列の終わり(string terminator) がファイルの終わりまでに(anywhere before EOF) 見つからなかった(Can't find)

(意訳) 対応する " を書き忘れているとか、意図しない " が書いてあるとかで、ちゃんとした文字列になってない

と修正のヒントになる情報がちゃんと書いてあります。


○スクリプトの編集には、Perlに対応した色分けに対応したエディタを使うのもよいでしょう。
「文字列の色」「命令の色」等が付くので、意図しない文字列が判別しやすくなります。
    • good
    • 0

" (ダブルクオーテーション/二重引用符) を使った文字列の性質を理解し、正しい使い方をしましょう。


今回の場合なら
・\\ と書いて「バックスラッシュ(または円記号)そのもの」と解釈させる
・' (シングルクオーテーション/引用符) を使って、\ による展開をしないようにする
のどちらかが必要です。



Perlの"(ダブルクオーテーション/二重引用符) の文字列では、一部の文字が展開されます。

バックスラッシュ(または円記号) は、続く文字列とセットで特殊な展開が行われます。
(\n が 「改行文字」 に展開される、など)

\" は、 「"そのもの」に展開されます。
これは、ダブルクオーテーションの文字列中にダブルクオーテーションを書きたいときに使います。

今回の場合

$path1=$path0.
” ← ここから文字列が始まって
\" ← が「"」という文字と判定される(=文字列の終りではない"
.$dname;
  print( ← までが文字列の中
"← 文字列終り
$path1\n ← 文字列の外
" ); ← 新しい文字列

と解釈されます。そのため、意図しないプログラムになってエラーになっています。
    • good
    • 0

$path1=$path0.”\".$dname;の後ろ、


つまり、print( "$path1\n" );の前に、全角ブランクが入って無い??
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2021/12/06 15:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!