0

次の行を含む非常に単純な Perl スクリプトを作成しました。

my $q_it = $dbh->prepare('SELECT customdata.Field_ID,
  customdata.Record_ID,
  customdata.StringValue
  FROM customdata
  WHERE customdata.Field_ID='\'10012'\' && (StringValue LIKE '\'1%'\' OR StringValue LIKE   '\'2%'\' OR StringValue LIKE '\'9%'\');
  ');

customdata はテーブルです。

ただし、「WHERER」句について不平を言う構文エラーが常に発生しました。

Backslash found where operator expected at /home/wblocaladmin/Robert_2.pl line 18, near "'10012'\"

引用文内の引用なので、上記のようにシングルクォートをエスケープしてみました。どこが間違っていたのかを特定するのを手伝ってくれる人はいますか?

ありがとう!

4

4 に答える 4

5

文字列を囲むために二重引用符を使用しないのはなぜですか?

my $q_it = $dbh->prepare("SELECT customdata.Field_ID,
  customdata.Record_ID,
  customdata.StringValue
  FROM customdata
  WHERE customdata.Field_ID='10012' && (StringValue LIKE '1%' OR StringValue LIKE   '2%' OR StringValue LIKE '9%');
  ");
于 2012-05-08T19:58:07.653 に答える
4

qを使用して、単一引用符を含む文字列を引用します。

my $q_it = $dbh->prepare(q{SELECT customdata.Field_ID,
   customdata.Record_ID,
   customdata.StringValue
   FROM customdata
   WHERE customdata.Field_ID='10012' 
   && (StringValue LIKE '1%' OR StringValue LIKE   '2%' OR StringValue LIKE '9%')
});

ヒアドキュメントも使用できます。

my $q = <<'QUERY';
    SELECT customdata.Field_ID,
    customdata.Record_ID,
    customdata.StringValue
    FROM customdata
    WHERE customdata.Field_ID='10012' 
    && (StringValue LIKE '1%' OR StringValue LIKE   '2%' OR StringValue LIKE '9%')
QUERY
my $q_it = $dbh->prepare( $q );

注: DBI クエリに属さないため、セミコロンを削除しました。

記録として、perl で連結する正しい方法は次のとおりです。

my $string = 'foo' . 'bar'; ## foobar

perlで区切る正しい方法は次のとおりです。

my $string = 'foo \'bar\''; ## foo 'bar'
于 2012-05-08T20:02:37.063 に答える
3

aleroot's answer の代わりに、引用符のエスケープを修正できます。エスケープされたものの前後に不要な一重引用符があります。

my $q_it = $dbh->prepare('SELECT customdata.Field_ID,
  customdata.Record_ID,
  customdata.StringValue
  FROM customdata
  WHERE customdata.Field_ID=\'10012\' && (StringValue LIKE \'1%\' OR StringValue LIKE   \'2%\' OR StringValue LIKE \'9%\');
  ');
于 2012-05-08T20:00:29.480 に答える
0

二重引用符を使用して痛みを和らげることができますが、ここでの問題は、.(ドット) 演算子を使用せずに文字列を連結しているだけです。

于 2012-05-08T19:59:39.420 に答える