2012-04-24 12 views
0

私はこのウェブサイトからニンテンドーDSの価格をlynx -dumpを使って引き出しています。アポストロフィを含むURLでlynx -dumpを使用するにはどうすればよいですか?

たとえば、のは、私はゲームヨッシーTouch用のWebページから引っ張って行くつもりですと言ってみましょう:

/usr/bin/lynx -dump -width=150 http://videogames.pricecharting.com/game/nintendo-ds/Yoshi-Touch-and-Go 

すべてが正常に動作し、私は簡単に価格を引っ張るために正規表現を使用することができます。この問題は、URLにアポストロフィ( ')またはアンパサンド(&)が含まれているときにエラーが発生したときに発生します。ここで

sh: -c: line 0: unexpected EOF while looking for matching `'' 
sh: -c: line 1: syntax error: unexpected end of file 

コードです:

/usr/bin/lynx -dump -width=150 http://videogames.pricecharting.com/game/nintendo-ds/Yoshi's-Island-DS 

は、これらのほとんどのエラーを私に与える:だから私はこのコード行を使用する、のは私がしようとするとゲームヨッシーアイランドDS用のページを見つけましょう私は、 "http://videogames.pricecharting.com/game/nintendo-ds/Yoshi's-Island-DS"を含む文字列である$fullURLで-dumpを呼び出すのに使用します。

$command  = "/usr/bin/lynx -dump -width=150 $fullURL"; 
@pageFile = `$command`; 

$fullURL文字列をURL互換文字列に変換する解決策を見つけられる人はいますか?

+1

[LWP](http://p3rl.org/LWP)と[LWP :: Simple](http://p3rl.org/LWP::Simple)をご覧ください。シェルを使用して 'lynx'を呼び出すよりも、Webページの内容が重要です。 –

+0

私は間違いなくそれを念頭に置いています。私はperlクラスの最終プロジェクトのためにDSの価格チェッカープログラムを作っていました。私たちはこのセミナーの前に、lynxを使ってページの内容をダンプするのと同じ方法を使っていました。だから私はこのプロジェクトのためにも同じ方法を使い続けました。私はちょうどそれをすべて終了し、それは効率的ではありませんが、すべてのゲームを処理するためにしばらく時間がかかりますが、うまく動作します。しかし、アイデアをありがとう! :) – Nick

答えて

3

URLにある'をエスケープしてからシェルに渡す必要があります。 Perlは、ほとんどのシェルで必要なエスケープを実行するquotemeta関数を提供しています。

my $quoted_URL = quotemeta($fullURL); 
$command  = "/usr/bin/lynx -dump -width=150 $quoted_URL"; 
... 

はまた、同じ結果を文字列に\Q\Eエスケープを使用することができます。

$command  = "/usr/bin/lynx -dump -width=150 \Q$fullURL\E"; 
... 
+0

完璧!それはちょうどそれがうまくいった!ありがとう! – Nick

+1

'quotemeta'と' \ Q'はシェル文字ではなく正規表現を引用するためのものです!好奇心の外にちょうど – daxim

1

この問題に対処するための正しい方法はPerl equivalent of PHP's escapeshellargを参照して、system /パイプopen(QX /バッククォート演算子の代替)のリスト形式を使用して、シェルを回避することです。これは実用的ではない、引用適切なシェルをString::ShellQuoteWin32::ShellQuoteを介して提供されるまれに

use autodie qw(:all); 
open my $lynx, '-|', qw(/usr/bin/lynx -dump -width=150), $fullURL; 
my @pageFile = <$lynx>; 
close $lynx; 

+0

、なぜシェルからURLを引き出すのが悪いですか? – Nick

+0

質問はなぜシェルを避け、代わりに解釈せずにexecveシステムコールにパラメータを渡すのが好きなのですか?より効率的です:プログラムの起動ごとに1つのプロセスを保存します。より安全です:シェル注入バグのすべてのクラスを排除します。より強力です: '' 'や'& 'のような文字は特別な扱いを必要としません。 – daxim

関連する問題