0

以下のperlgrepregexを使用すると、正しく機能します。

  my  @cont = grep {/,\s*511747450\s*,\s*CAN2\s*$/} @fileContents;

UNIXシステムに変換したいのですが、以下の方法でコマンドを grep使用して同じ正規表現を試しましたが、機能しません。system

  my $cmd="grep ,\s*5117474501\s*,\s*CAN2\s*\$ " . $dirPath . "/" .$fileName;
  my $exitStatus =system($cmd);
4

2 に答える 2

6

\*および$シェルに固有です。もう少し逃げる必要があります。

use String::ShellQuote qw( shell_quote );

my $pat = ',\\s*5117474501\\s*,\\s*CAN2\\s*$';

my $cmd = shell_quote('grep', '--', $pat, "$dirPath/$fileName");
my $exitStatus = system($cmd);

または、の複数引数形式を使用して、シェルを単純に回避することもできますsystem

my $pat = ',\\s*5117474501\\s*,\\s*CAN2\\s*$';

my @cmd = ('grep', '--', $pat, "$dirPath/$fileName");
my $exitStatus = system({ $cmd[0] } @cmd);
于 2012-10-04T01:46:46.050 に答える
3

\s一部のバージョンでは、grepはbashでは機能しません。

[:space:]の代わりに試してください\s

grepの動作は、バージョンによって異なります。

于 2012-10-04T01:06:52.757 に答える