0

lynx -dump を使用して、この Web サイトからニンテンドー DS の価格を取得しています。

たとえば、ゲームのヨッシー タッチ アンド ゴーの Web ページからプルするとします。

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

すべてが正常に機能し、Regex を使用して価格を簡単に引き出すことができます。この問題は、URL にアポストロフィ (') またはアンパサンド (&) が含まれている場合に発生し、エラーが発生します。たとえば、ヨッシーアイランド DS というゲームのページを見つけようとすると、次のコード行を使用します。

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

これらの小さなエラーが発生します:

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

$fullURLこれは、 「http://videogames.pricecharting.com/game/nintendo-ds/Yoshi's-Island-DS」を含む文字列で-dump を呼び出すために使用するコードです。

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

$fullURL文字列を URL と互換性のある文字列に変換するソリューションを見つけるのを手伝ってくれる人はいますか?

4

2 に答える 2

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";
...
于 2012-04-24T19:27:58.647 に答える
1

この問題に対処する正しい方法は、system/ pipeのリスト形式open(qx / backtick演算子の代わり)を使用してシェルを回避することです。PHPのescapeshellargに相当するPerlを参照してください。

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

これが実用的でないまれなケースでは、適切なシェル引用符がString::ShellQuoteおよびWin32:: ShellQuoteを介して提供されます。

于 2012-04-24T21:52:09.797 に答える