2

コマンドラインで「sed」を使用している場合は機能しますが、perl スクリプトに含まれている場合は機能しません。

例は sed 's/\s+//g' aaa > bbbです。

しかし、perlスクリプトを介して同じコマンドを呼び出そうとしているときに言います

$gf = `sed 's/\s\+//g' aaa > bbb` ;

出力ファイルは入力ファイルと同じままです!!!! 提案してください。

4

3 に答える 3

4

Perl では、バッククォートには、二重引用符で囲まれた文字列と同じエスケープおよび補間規則があります。未知のエスケープ コードを形成するバックスラッシュは、バックスラッシュを忘れます"\." eq "."

したがって、Perl コード

print `echo \"1\"`;
print `echo \\"1\\"`;

出力

1
"1"

そのコマンドを Perl に埋め込みたい場合は、バックスラッシュがellsedに届くようにエスケープする必要があります。sh

$gf = `sed 's/\\s\\+//g' aaa > bbb`;

$gf実際には、出力をファイルにリダイレクトするため、出力は得られません。私たちはただできる

use autodie;

system "sed 's/\\s\\+//g' aaa > bbb";

または一重引用符で:

use autodie;

system q{ sed 's/\s\+//g' aaa > bbb };

バックスラッシュを保持します。

それでも、Perl 自体が置換を適用できるため、これはまったく必要ありません。

use autodie; # automatic error handling

open my $out, ">", "bbb";
open my $in,  "<", "aaa";
while (<$in>) {
  s/\s\+//g; # remove all spaces followed by a plus
  print {$out} $_;
}
于 2013-06-21T11:27:24.370 に答える
-2

持っていますか

  use strict;
  use warnings;

ファイルの先頭に?

コマンドを実行するには、バッククォートが必要になる場合があります

  $gf = `sed 's/\s\+//g' aaa > bbb`;
于 2013-06-21T11:26:59.603 に答える