1

1行変更する必要のあるファイルがたくさんあります。

コードは次のとおりです。

GetOptions ('full' => \$full,
        'dbno=s' => \$dbno,
            'since=s' => \$since,
            'printSQL' => \$printSQL,
            'nwisDB=s' => \$nwisDBOption);

# Find the NWISDB to be extracted

if ($nwisDBOption eq '') {
  $nwisdb = &WSCExtractor::getNwisdb;
} else {
  $nwisdb = uc($nwisDBOption);
}

これが私が欲しいものです:

GetOptions ('full' => \$full,
        'dbno=s' => \$dbno,
            'since=s' => \$since,
            'printSQL' => \$printSQL,
            'nwisDB=s' => \$nwisDBOption) || &WSCExtractor::usage();

# Find the NWISDB to be extracted

if ($nwisDBOption eq '') {
  $nwisdb = &WSCExtractor::getNwisdb;
} else {
  $nwisdb = uc($nwisDBOption);
}

これが私が使っているperlコマンドです:

perl -pi -e "s/\\\$nwisDBOption\);/\\\$nwisDBOption\) || \&WSCExtractor::usage\(\);/" extractor-template

結果は次のとおりです。

GetOptions ('full' => \$full,
        'dbno=s' => \$dbno,
            'since=s' => \$since,
            'printSQL' => \$printSQL,
            'nwisDB=s' => \$nwisDBOption) || &WSCExtractor::usage();

# Find the NWISDB to be extracted

if ($nwisDBOption eq '') {
  $nwisdb = &WSCExtractor::getNwisdb;
} else {
  $nwisdb = uc($nwisDBOption) || &WSCExtractor::usage();
}

$ nwisDBOptionの前に\がない場合でも、2番目のインスタンスと一致しています。perlがそれらを食べていた場合に備えて、前にさらに\を追加してみました。その時は一致しませんでした。ありがとう。

4

1 に答える 1

2

Windows ではなく Unixish OS を使用していると仮定しています。コードを二重引用符で囲んでいるため、シェルはそれを解析し、特に二重のバックスラッシュを単一のバックスラッシュに置き換えます。したがって、perl が見るコードは実際にはそうではありません:

s/\\\$nwisDBOption\);/\\\$nwisDBOption\) || \&WSCExtractor::usage\(\);/

しかし:

s/\$nwisDBOption\);/\$nwisDBOption\) || \&WSCExtractor::usage\(\);/

これは、次のコマンドを実行することで簡単に確認できます。

echo "s/\\\$nwisDBOption\);/\\\$nwisDBOption\) || \&WSCExtractor::usage\(\);/"

とにかく、問題を解決するにはいくつかの方法があります。私がお勧めするのは、二重引用符の代わりに一重引用符を使用するか、単にコードを実際の Perl スクリプト ファイルに書き込んで実行することです。

ただし、どうしてもやりたい場合は、コード内のすべてのバックスラッシュを 2 つにすることもできます。

于 2012-12-27T17:25:00.010 に答える