2015-06-30 2 views
0

Я немного застрял в проблеме о том, как объявить grep изнутри perl-скрипта. То, что я хочу сделать, это пусть мой Perl скрипт, чтобы выполнить следующую команду:Grep изнутри скрипта perl

cat config.ini | grep -v "^#" | grep -v "^$" 

Обычно это выражение будет очищать/фильтровать все записи, которые имеют # и $ в начале и печатать переменные сконфигурированные.

Однако я не знаю, как объявить об этом. Я использовал следующее выражение, но когда я дошел до точки, чтобы ввести grep # или $, это не сработало

system("(cat config.ini| grep ........); 

Любое предложение?

+1

'/^[# $]/или печатать в то время как <$fh>;' или 'perl -ne '/^[# $]/или печатать' config.ini' –

ответ

4
cat config.ini | grep -v "^#" | grep -v "^$" 

является плохим способом написания

grep -v "^[#$]" config.ini 

Для получения строки

grep -v "^[#$]" config.ini 

Вы можете использовать строковый литерал

'grep -v "^[#$]" config.ini' 

Так

system('grep -v "^[#$]" config.ini'); 
die("Killed by signal ".($? & 0x7F)."\n") if $? & 0x7F; 
die("Exited with error ".($? >> 8)."\n") if $? >> 8; 

system('grep -v "^[#$]" config.ini'); 

коротка для

system('/bin/sh', '-c', 'grep -v "^[#$]" config.ini'); 

Но нам не нужны оболочки, поэтому следующие можно использовать вместо:

system('grep', '-v', '^[#$]', 'config.ini'); 
die("Killed by signal ".($? & 0x7F)."\n") if $? & 0x7F; 
die("Exited with error ".($? >> 8)."\n") if $? >> 8; 

Но это было бы более чистым и надежным в Perl.

open(my $fh, '<', 'config.ini') 
    or die($!); 

while (<$fh>) { 
    print if !/^[#$]/; 
} 
3

Если вы внешние вызовы в grep из внутри программы Perl, то вы делаете это неправильно. Нет ничего, что grep может сделать то, что Perl не может сделать для вас.

while (<$input_filehandle>) { 
    next if /^[#$]/; # Skip comment lines or empty lines. 

    # Do something with your data, which is in $_ 
} 

Update: Думать дальше об этом, я думаю, что я бы написал ее немного по-другому.

while (<$input_filehandle>) { 
    # Split on comment character - this allows comments to start 
    # anywhere on the line. 
    my ($line, $comment) = split /#/, $_, 2; 

    # Check for non-whitespace characters in the remaining input. 
    next unless $line =~ /\S/; 

    # Do something with your data, which is in $_ 
} 
0
print if !(/^#/|/^$/); 

я попробовать использовать выражение предложил, но не работает так хорошо, как этот, есть способ уменьшить его или записать ИК в лучшую сторону?

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