2011-09-06 3 views
1

메신저 bash는 스크립트에 펄 스크립트의 인수를 전달합니다,하지만 난 메신저이어떻게 펄에서 그렙를 사용하려고

#!/usr/bin/perl 
system(grep -c $ARGV[0] $ARGV[1]); 

이 오류가 발생하고, 그렙 옵션을 사용하는 펄에서 인수를 받아 봐해야 어떻게 구현할 수 있습니까?

+1

'별명 grepc = '그렙 -c $ @''에서' – ikegami

답변

7
system('grep', '-c', $ARGV[0], $ARGV[1]); 

하지만 그렇게하고 싶은지 생각해보십시오. Perl은 외부 프로그램을 호출하지 않고도 많은 것을 할 수 있습니다.

+1

참조 .bashrc' http://stackoverflow.com/questions/3477916/using-perls-system/3478060 # 3478060 오류 처리. – daxim

0

system()의 인수는 문자열 (또는 문자열 목록)이어야합니다. 시도해보십시오 :

#!/usr/bin/perl 
system("grep -c $ARGV[0] $ARGV[1]"); 
+2

목록 양식이 더 안전합니다. 누군가가' '의 첫 번째 인수를 사용하여 스크립트를 호출했을 가능성을 고려하십시오. rm -rf $ HOME''. 스크립트가 추가 권한 (사용자가'rm -rf $ HOME'을 직접 실행할 수도 있음)으로 실행하지 않는 한 그다지 문제가되지 않습니다.하지만 생각할 가치가 있습니다. 단일 문자열 형식은 명령을 실행하기 위해 셸을 호출해야하는 경우 유용합니다. 예를 들어,'system ("command1 | command2")'*는 Perl로 할 수 있지만, 많은 작업이 필요합니다. 'perldoc -f system' –

+1

'script.pl '과 같은 간단한 일도 실패합니다. "file 할 수 없습니다." – ikegami

0

해당 코드에서 기대하는 것을 얻지 못할 수도 있습니다. perldoc -f system에서 :

The return value is the exit status of the program as returned by 
the "wait" call. 

system 실제로 grep에서 당신은 grep 과정에서 불과 반환 값을 카운트를 제공하지 않습니다.

perl 내에서 값을 사용할 수 있으려면 qx() 또는 backticks를 사용하십시오. 예 :

my $count = `grep -c ... `; 
# or 
my $count2 = qx(grep -c ...); 

숫자 뒤에 개행 문자가 표시됩니다. "6 \ n".

그러나 모든 perl을 사용하지 않는 이유는 무엇입니까?

my $search = shift; 
my $count; 
/$search/ and $count++ while (<>); 
say "Count is $count"; 

하지만, 잘못된 손에 위험 할 수있는 다이아몬드 연산자 <>에 의해 수행 암시 open

. 대신 열린 세 인수를 사용하여 수동으로 파일을 열 수 있습니다

use autodie; 
my ($search, $file) = @ARGV; 
my $count; 
open my $fh, '<', $file; 
/$search/ and $count++ while (<$fh>); 
say "Count is $count"; 
관련 문제