-1

このコマンドをperlで実行したい

for dir in *; do
 test -d "$dir" && ( find "$dir" -name '*test' | grep -q . || echo "$dir" );
 done

私が試してみました :

 system ("for dir in *; do
        test -d "\$dir" && ( find "\$dir" -name '*test' | grep -q . || echo "\$dir" );
        done");

しかし、動作しません。

4

4 に答える 4

3

File::Findモジュールのfind関数を使用した純粋なPerl実装:

#!/usr/bin/env perl

use strict;
use warnings;

use File::Find;

find \&find_directories, '.';

sub find_directories {
    if ( -d && $File::Find::name =~ /test$/ ) {
        print "$File::Find::name\n";
    }
}
于 2012-08-20T11:22:24.160 に答える
1

見積もりがオフになっています。

"for dir in *; do
    test -d "\$dir" && ( find "\$dir" -name '*test' | grep -q . || echo "\$dir" );
    done"

文字列を二重引用符で区切ることにしまし"たが、それらは文字列に含まれています。

他の引用符をエスケープする

"for dir in *; do
    test -d \"\$dir\" && ( find \"\$dir\" -name '*test' | grep -q . || echo \"\$dir\" );
    done"

(エラーが発生しやすい、醜い)

…または別の区切り文字を使用する:Perlは幅広い可能性を提供します。これらの引用構文は、内部の変数を補間します。ここで、任意の文字を区切り文字として使用できます。非補間構文は次のとおりです。以前と同じ区切り文字の柔軟性を備えています。"…"qq{…}[^\s\w]'…'q{…}

qq{for dir in *; do
    test -d "\$dir" && ( find "\$dir" -name '*test' | grep -q . || echo "\$dir" );
    done}

qand構文はqq、オカレンスのバランスが取れている場合、文字列内に区切り文字を含めることができますq( a ( b ) c )

3番目の引用メカニズムはヒアドキュメントです:

system( <<END_OF_BASH_SCRIPT );
for dir in *; do
    test -d "\$dir" && ( find "\$dir" -name '*test' | grep -q . || echo "\$dir" );
    done
END_OF_BASH_SCRIPT

これは、区切り文字を気にせずに長いフラグメントを含める場合に便利です。文字列は、それ自体の行に表示される必要がある事前定義されたトークンで終了します。区切り文字宣言が一重引用符(<<'END_OF_SCRIPT')で囲まれている場合、変数は補間されません。

system( <<'END_OF_BASH_SCRIPT' );
for dir in *; do
    test -d "$dir" && ( find "$dir" -name '*test' | grep -q . || echo "$dir" );
    done
END_OF_BASH_SCRIPT

q{}および構文に関する注意qq{}:これは、難読化以外では使用できない機能ですが\w、区切り文字として文字を使用することは可能です。引用符演算子qまたはqqと区切り文字の間にスペースを含める必要があります。これは機能します:q xabcxそしてはに等しい'abc'

于 2012-08-20T11:12:43.653 に答える
0

スクリプトを開始する代わりに、スクリプトを実行するbashインスタンスを開始してみてください。例えば

system("bash -c 'for dir bla bla bla'");
于 2012-08-20T10:56:22.910 に答える
0

system()デフォルトのシステムシェルを使用しますが、これはおそらくBashではありません。解決策は、system()コマンドを使用してBashを明示的に呼び出すことです。

于 2012-08-20T11:01:08.847 に答える