• ベストアンサー

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

  • 初歩的なCGIですが その2

    print <<END_OF_DATA; Content-type:text/html <html> <head> <title>test</title> </head> <body> This is TEST page. </body> </html> END_OF_DATA 上記プログラムをperlプログラムで実行したら、 「Can't find string terminator "END_OF_DATA" anywhere before EOF at inout3.pl line 1.」 と出てきて正しく出力されません。なにがいけないのでしょうか?最後の「END_OF_DATA」の後は空白・改行はありません。 どなたか教えて下さい。お願いします。

    • ベストアンサー
    • CGI
  • まったくわかりません。お手上げです。

    今、CGIでワンクリックアンケートをスタッフに作ってもらっていたんですが、そのスタッフが退職し、CGIの分かる人がいなくなりました。 しかも、そのプログラムには以下のようなエラーが出るのです。 ----- Possible unintended interpolation of @form in string at ./poll.cgi line 108. Unrecognized character \x83 at ./poll.cgi line 222. ----- ----- Can't find string terminator "`" anywhere before EOF at ./poll.cgi line 494. ----- ----- Unrecognized character \x83 at ./poll.cgi line 621. ----- <全ソースはりつけたいのですがひとまずやめておきます(フリーのようですで貼り付けてもいいのかな?)> これだけではわからないものでしょうか?どなたか分かられる方、よろしくおねがいいたします。

    • 締切済み
    • CGI
  • ActivePerlへXML::LibXSLTを!

    Windows7上にインストール済のActivePerlへ 「XML::LibXSLT」モジュールを 追加でインストールする方法を教えてください。 (ちなみに、以前に、XML::LibXML;はインストール済であり、  今も正常に動いているのですが、  以前と同じ方法   ↓ コマンドライン上から、 ppm-shell upgrad -i install XML::LibXSLT を実行すると、 ”ppm install failed: Can't find any package that provides XML::LibXSLT” エラーメッセージが出て、 インストール出来ない状況です。 なお、Windows7内に対して、 libxslt(xsltprocツール)をインストールして、 xsltproc --version を実行すると正常にバージョン内容が表示されている状況です。 しかし、 Eclipse3.6の、Perlソース内、 「use XML::LibXSLT;」 行のみ、 ×印の赤丸印が消えない(XML::LibXSLTがインストールされていない為) 状況です。 以上になります。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • ActivePerlでデータベース(oracle)

    お世話になります。 http://okweb.jp/kotaeru.php3?q=1573758で質問をしている者です。 未解決ですが、環境の構築段階からうまくできていないのではと思い perlでOracle環境を構築する方法を確認させていただきいです。 http://www.tohoho-web.com/lng/199909/99090253.htm http://homepage3.nifty.com/hippo2000/perltips/perlora.htm 上記を参考に、PPMから必要なモジュール DBI DBD-Oracle をinstallしているのですが、インストールは問題なく終了します。 接続を試みると、前回質問させていただいたエラーになります。 何か見落としているのでしょうか・・、他にどんな原因が考えられるかなど なんでもよいのでご教示いただけたらと思います。 宜しくお願い致します。 ActivePerl5.8.6 windows2000server oracle8i

    • ベストアンサー
    • Perl
  • ActivePerlのWWW::Mechanize::Firefoxに

    ActivePerlのWWW::Mechanize::Firefoxについて教えてください。 http://maaash.jp/perl/wwwmechanizefirefox%E3%81%A7%E7%B0%A1%E5%8D%98%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88/ 上記のURIを参考にHPの自動テストとスクリーンショットを行うプログラムを作ろうとしています。 当方はPerl及びLinuxsは素人です。 まず、Windows XP sp3に ActivePerl v5.10.1をインストールして 上記サイトに記述されているソースをもとにソースファイルを作り実行したところ 「Can't locate WWW/Mechanize/Firefox.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) line 3」 とエラーが表示されたので。 http://search.cpan.org/~corion/WWW-Mechanize-Firefox-0.31/ ↑よりファイルをダンロードして「Perl Package Manager」でインストールしたところ 「WARNING: Installing WWW-Mechanize-FireFox-0.11 would downgrade HTML::Display::MozRepl from version 0.31 to 0.11」と表示されます。 そこから色々と調べながらやっているのですが先に進めません。 Googleで調べてみると「WWW::Mechanize」ってすげー簡単とか賞賛する書込みが多いためすごい ショックでくじけまくってます。 先に進むためのヒントだけでもお願いできないでしょうか?

  • Perl DBD::Mysql

    はじめて質問いたします。 現在MovableType導入しようとしています。 ですが、ActivePerlとMYSQLを接続させる為のDBD::Mysqlが インストールができません。どなたか詳細な方法を 教えてください。 ActivePerl:5.10 windows XP Apache 2.0.63 DBIはインストールできています。 コマンドプロンプトで ppm-shell install DBD-mysql 上記を試すと下記のエラーがでます。 ppm 4.02Copyright (C) 2007 ActiveState Software Inc. Allrights reserved. ppm> install DBD-mysql Downloading ActiveState Package Repository packlist...not modified ppm install failed: Can't find any package that provides DBD-mysql Perl package managerで確認すると DBD::Mysqlはありませんでした。 よろしくお願いします。

  • PHPで入力した内容をMYSQLに登録するとエラーが表示。

    PHPで入力した内容をMYSQLに登録するとエラーが表示。 PHP側のフォームにパソコンと入力しMYSQL側に登録すると、 DB Error unknown errorと表示されていますが、 MYSQLのデータベースの中を確認すると、パソコンと登録されています。 PHPとMYSQLはsjisで設定します。 このエラーの回避は出来るのでしょうか?ご教授お願いします。

    • 締切済み
    • PHP
  • Thinkpad X395 カメラ見つからない

    カメラを開くと、「We can't find your camera」、「No cameras are attached」というエラーが出た。ちなみに、Device Managerで確認しても、カメラのドライバが見つからない。 ※OKWAVEより補足:「Lenovo:ノートブック(ThinkPad)」についての質問です。

  • 大文字を小文字に変換するプログラム

    if((fp4 = fopen("sample.txt","r")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ while((c=fgetc(fp4))!=EOF){/*EOFまでfp4に入力*/ if(isupper(c)){ c=tolower(c); printf("%s",c); } else printf("a"); //確認用 } } ファイルから文字を読み込んでctype関数を使って大文字から小文字に変換したいんですがうまくいきません。 コンパイルしても確認用が反応しないんでおそらくどこか間違ってると思うんですがわかりません。 ご教授宜しくお願いします。

  • perlからアマゾンにアクセスできない><

    いつもお世話になっております。 ハックスに記載されているスクリプトを実行したいのですが、エラーとなります。 自分でも調べていますが、perl経験が浅く、原因が特定できません。 修正箇所がわからないので、修正できる方教えて下さい(;へ;) 環境は、XP2で、Activeperl 5.8.8を使用しております。 コマンドラインからused_report.pl 4915512371(←ASIN名:例:ハリーポッター)を実行すると・・・ --------コマンドラインエラー箇所-------- Global symbol "$lastPrice" requires explicit package name at C:\hoehoe\used_report.pl line 32. Global symbol "$avgPrice" requires explicit package name at C:\hoehoe\used_report.pl line 41. Can't find string terminator "EOF" anywhere before EOF at C:\hoehoe\used_report.pl line 44. --------------------------------------- ちなみにブラウザ上ではページも存在し表示されております。 http://www.amazon.co.jp/exec/obidos/tg/stores/offering/list/-/4915512371/used/ 以下スクリプト //////////////////////////////////////////////////////////////// #!/usr/bin/perl # used_report.pl # A script to scrape Amazon, retrieve used listings, and write to a file # Usage: perl used_report.pl <asin> #コマンドラインからASINを取得 my $asin =shift @ARGV or die "Usage:perl used_report.pl <asin>\n"; use strict; use LWP::Simple; #URLを作成 my $url = 'http://www.amazon.co.jp/exec/obidos/tg/stores/offering/list'.'/-/' . $asin . '/used/'; #URLをリクエスト my $content = get($url); die "Could not retrieve $url" unless $content; #変数を設定 my $i = 0; my $totalprices = 0; my $thisPrice = 0; my $highPrice = 0; my $lowPrice = 0; #リスティングをループ while ($content =~ m!<b class=price>\$(.*?)</b>!mgis) { $i++; $thisPrice = $1; if ($thisPrice >= $lastPrice) { $highPrice = $thisPrice; } if ($i == 1 || $thisPrice <= $lowPrice) { $lowPrice = $thisPrice; } $totalprices += $thisPrice; } $avgPrice = $totalprices / $i; #結果を表示 print <<"EOF"; Average Used Price: \$$avgPrice Highest Price: \$$highPrice Lowest Price: \$$lowPrice ////////////////////////////////////////////////////////////////

    • ベストアンサー
    • Perl