2017-03-20 7 views
2

나는 perl newb입니다.perl 사용자가 제공 한 하위. 항상 평가판이 아닌 텍스트를 반환합니다.

불행하게도, eval 내가

을 기대하고있어 방법을 작동하지 않습니다 내 모의 예 :

my $filter = 'return false;'; 
my $filterFunc = sub{ eval{ $filter } } ; 
while (my $entry = readNextEntry()){ 
    print "Eval:".$filterFunc->($entry)."\n"; 
} 

내가 이것을 실행하면, 나는 (이 아니라 모든 패스에서 반환되는 문자 "return false;"를 얻을 수 함수가 평가되고 있음). 몇 가지 변형을 시도했지만 마법의 조합을 타격하지는 않습니다. 보안 문제에

주의 사항 : I는 사용자 오전, 나는이 코드가 수행에 전달 된 것에 대한 보안 문제가없는

.

내 의도는 여러 매개 변수를 가져 와서 매개 변수를 기반으로 항목을 필터링하는 것입니다. 어떤 매개 변수가 유용할지 모르므로 일부 텍스트를 전달할 수 있다고 생각했습니다. eval 익명 함수로 텍스트가 전달되었습니다. , 각 레코드 (필터 함수)에 대해 함수를 실행하십시오. 필자는 사용자이므로 전달 된 코드에 대한 보안 문제는 없습니다.

+2

당신의 접근 방식이 올바로 작동하는 동안 당신은 당신이 '평가'에 너무 신경을 써야한다고 생각하지 않는다는 것을 이해합니다. 그러나 저는 여전히 다른 종류의 필터를 구현하는 것이 안전 할 것이라고 말합니다. 필요한 경우 인수로 호출하십시오. 디스패치 테이블은 여기에 편리 할 것입니다. 자신을 사용자로 신뢰하지 마십시오. – simbabque

+0

전 완전히 다른 솔루션을위한 게임입니다. * 매우 * 일반적인 쿼리 유틸리티를 구현하려고합니다. 이 평가에 대한 요점은 항상 참/거짓을 반환하고 결코 다른 것을 수행하지 않는 함수로 해결되어야한다는 것입니다. 단기적으로, 분명히 나는 ​​방금 eval이 어떻게 작동하는지 잘못 읽었다. –

+1

당신은 무엇을 질문하고 있습니까? 데이터가 어떤 방식 으로든 레코드 기반이라면 관계형 데이터베이스에로드하고 SQL을 사용하는 것이 어떻습니까? 그게 질의 하는게 좋다고 들었어. – simbabque

답변

4

당신은 문자열 eval하지 블록 eval을 할 필요가있다.

my $filterFunc = sub{ eval{ $filter } } ; 

eval BLOCKtry/catch기구 같다. 임의 코드를 평가하지 않습니다. 블록 안의 코드에서 오류를 포착합니다. 원하는 것은 문자열 eval입니다.

$ perl -E 'my $filter = sub { my $f = shift; eval $ARGV[0]; }; for (1 .. 10) { say $_ if $filter->($_) }' '$f % 2' 
1 
3 
5 
7 
9 

그러나, 펄에는 false 없다 :

my $filterFunc = sub{ eval $filter }; 

는 여기에 내가 당신이하려는 생각의 구현 예입니다. 그건 키워드가 아니야. sub false 어딘가에 있지 않으면 use strict이 있는지 여부에 따라 구문 오류가 발생할 수 있습니다.

read up on eval이어야합니다. 당신이 원하는 모든 것을 거짓 대신 0를 사용을 반환하는 $filterFunc 경우


. 리터럴 문자열 "return false;"은 Perl에서 인 입니다.

+0

"return false"는 정확하게 내가 쳤던 다음 문제였습니다. –