2012-08-20 3 views
-1

Я хочу, чтобы запустить эту команду в Perlвыполнения Баш скрипт в 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

Это оболочки код легко реализуется в Perl. Неправильно использовать несколько разных языков, если это необходимо – Borodin

ответ

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} 

Конструкции и qq могут включать разделитель внутри строки, если вхождение сбалансировано: q(a (b) c) работает.

Третий механизм цитирования является здесь-док:

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 

Это полезно для включения более длинные фрагменты, не заботясь о delimitor. Строка заканчивается предопределенным токеном, который должен появиться на отдельной строке. Если декларация delimitor помещается в одиночных кавычках (<<'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'.

+0

Я удалил $, а вместо «Я использовал qq, как вы упомянули, все еще жалуется – shaq

+0

@shaq Какая часть это не работает? Вы получаете синтаксическую ошибку * в Perl, или она не работает во время выполнения или не работает сценарий оболочки? Что говорит об ошибке? Последний фрагмент кода компилирует все правильно со мной. – amon

+0

Это действительно работало, я делал ошибку благодаря – shaq

0

Вместо запуска скрипта попробуйте запустить экземпляр bash, который запускает скрипт. Например.

system("bash -c 'for dir bla bla bla'"); 
+0

Я хочу, чтобы скрипт находился внутри моей программы Perl – shaq

+0

@shaq: это решение Perl – Borodin

+0

Извините, я думал, что вы имеете в виду, что мне нужно передать имя моего сценария bash, во всяком случае, я сделал то, что вы сказал, что он все еще жалуется – shaq

3

Чистая реализация Perl с использованием функции findFile::Find модуля:

#!/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"; 
    } 
} 
+0

Большое спасибо, но дело в том, что я хочу использовать команду сценария оболочки в своей программе Perl :) – shaq

+0

Добро пожаловать. :-) –

Смежные вопросы