2012-06-22 2 views
2

읽어 주셔서 감사합니다.Perl wget 따옴표 문법 문제

wget과에 쉘 명령에 대한

,이 같은 작품 :

wget -q -O - http://www.myweb.com | grep -oe '\w*.\w*@\w*.\w*.\w\+' | sort -u 

을 그러나, 나는 백 슬래시 어디 운영자 발견 한 후 나는 "를 참조 구문 오류, 펄 프로그램 내에서 해당 명령을 삽입 할 때 운영자가 예상 한 곳에서 예상대로 베어 메드를 발견했습니다. " 그래서이 정규 표현식을 둘러싸고있는 따옴표를 {}로 대체했지만, 주석으로 처리하는 것은 오류를 가져 오지 않습니다. 그러나 정규 표현식이 아닌 것처럼 중괄호는 잘못된 시도.

는 foreach는 내부 코드입니다 :

foreach(@my_array) { 

$browser->get($_); 
# and here below is where the error comes 
system ('wget -q -O -"$_" | grep -oe '\w*.\w*@.\w*.\w\+' | sort -u'); 

내가 {로 정규 표현식을 감싸는 작은 따옴표를 교체 할 경우}, 다음 wget과는 URL을 얻을 않지만 grep 명령이 작동하지 않습니다.

은 그래서 당신이 원하는

답변

2

을 성가신 따옴표를 해결 구문하는 방법이 문제입니다 :

system ("wget -q -O -\"$_\" | grep -oe '\\w*.\\w*@.\\w*.\\w\\+' | sort -u"); 

당신은 당신이 따옴표로 좋아하는 것을 포함 할 수 있습니다 만 특정 문자를 탈출해야 .

덧붙여서 Perl의 qq() 운영자가 관심을 가질 수 있습니다. 당신은 그것을 볼 수 있습니다.

+0

감사합니다. 두 분, 고마워요. 지금 어떻게 두 분에게 정답을 감사 할 수 있습니까? 나는 둘 다 맞다고 믿는다. – iaintunderstand

+0

둘 다 upvote 할 수 있지만 * accept * one 만 가능합니다. 그것이 딜레마를 해결하면, @ simbabque의 답을 받아 들일 수 있습니다. 왜냐하면 저는 현재 그가 평판보다 더 많은 평판을 얻고 있기 때문에 환영받을 만합니다. 질문 주셔서 감사합니다. – thb

+0

@thb가 먼저 응답했거나 더 좋아하는 답변을 선택 했으므로이 응답을 선택하여 upvote 할 수 있습니다. 도와 줄 수있어서 기뻐. – simbabque

4

시스템 호출시 작은 따옴표 '을 사용하고 있습니다. 그들은 당신을 위해 변수를 채우지 않습니다. $_이 대체되지 않습니다. 또한 grep 옆의 작은 따옴표는이 잘못된 구문을 만듭니다.

대신을 시도해보십시오

system ("wget -q -O - $_ | grep -oe '\w*.\w*\@.\w*.\w\+' | sort -u"); 

또한 qq 연산자를 사용할 수 있습니다 perlop.


또 다른 생각을보고, 또한

system (qq(wget -q -O - $_ | grep -oe '\w*.\w*\@.\w*.\w\+' | sort -u)); 

을 : 당신은 $browser 객체가있는 경우 그 수는 get()입니다. , 왜 wget을 사용해야합니까? Perl에서도이 작업을 수행 할 수 있습니다.

+0

이것은 나쁜 대답은 아니지만'wget -q -0 - "foo bar"는'wget -q -0-foo bar'와 완전히 동일하지 않습니다. OP는 따옴표를 보유하고 싶지 않습니까? 또한 적어도 Perl 인터프리터에서는 역 슬래시를 이스케이프 처리하지 않은 채로 이스케이프 처리하지 않는 것이 효과가있는 것처럼 보이지 않으며 내보기에도 불량 스타일을 나타냅니다. – thb

+0

두 답이 모두 정확합니다. 두 분 모두 크레딧을받을 자격이 있습니다. 어떻게 두 분 모두에게 크레딧을 줄 수 있습니까? – iaintunderstand

+0

감사합니다. 방금 백 슬래시를 확인했습니다. OP는'\ n' 같은 것을 사용하지 않으므로 이스케이프없이 작동합니다. 나는 그들이 도망 쳤다는 것이 분명 할 것이라는 데 동의한다. 나는 혼란스럽지 않게 그것을 버렸다. 작은 따옴표와 관련하여 커맨드 라인 예제에서 그들은 존재하지 않았다. OP가 변수를 채울 것이라고 생각했기 때문에 OP에서 perl 코드를 사용한다고 가정했습니다. – simbabque