2010-07-30 3 views
2

내 펄 프로그램에서 문자열 (예 : 파일에서 읽음)을 코드 조각으로 사용하고 싶습니다. 예를 들어 문자열 (예 : $str="1..100,171,398..1000")을 읽은 다음 해당 문자열로 표시된 범위의 모든 숫자를 인쇄하고 싶습니다.perl : 문자열을 코드 조각으로 사용하십시오.

감사합니다, 데이브

+0

정확히 무엇을 의미합니까? 문자열을 읽고 Perl 문으로 실행하려는 것처럼 보이는 텍스트를 만들었지 만, 예제는 문자열을 약간의 코드 입력으로 구문 분석하려는 경우처럼 보입니다. 무엇 이니? – Stephen

+0

문자열을 읽고 Perl 문으로 실행하고 싶습니다. 예를 들어, for $ i (1..100,171,398..1000) {print "$ i"}'를 사용하여 목표를 달성 할 수 있습니다. –

답변

3

이 특정 경우를 들어, 일반적으로 How can I expand a string like "1..15,16" into a list of numbers?

를 참조 eval는 문자열에서 코드를 실행하는 데 사용됩니다. 실행할 전체 코드 파일이있는 경우 do을 사용하십시오. 그러나 이것을 고려하기 전에 파일/문자열이 안전한지 확인하십시오. 사실 "코드"가 예제와 같이 제한되어 있다면 이 아닌은 eval 또는 do를 사용하십시오.

업데이트 : Number :: Range는 넓은 범위에서 느리게 나타납니다. 귀하의 경우에 당신은 범위 대신에 Set :: IntSpan을 사용하는 것이 훨씬 낫습니다. 당신은 효율성에 대해 질문 : 배열을 사용하면 몇 메가 바이트의 메모리를 소비하지만, 그렇게 나쁘지는 않습니다. Set :: IntSpan은 배열을 생성하는 대신 사용할 수있는 반복 메서드를 제공하지만 아마 신경 쓰지 않을 것입니다.

+0

Number of Thanks for Range! 다른 질문 추가 : 내 범위가 상당히 큽니다 (일반적으로 두 개의 블록 만있는 500k 개의 숫자 즉, 1.20000, 700000..1000000과 같은 값). 파일로 인쇄하는 가장 효율적인 방법은 무엇입니까? 실제 배열을 만드는 것은 좋은 생각처럼 보이지 않습니까? –

0

변수에서 eval을 사용하여 코드를 실행할 수 있습니다. 보간은 재미있을 수 있지만.

eval "for ($str) { print \"\$_\n\";}"

1

Number::Range은 당신이 가지고있는 .. 구문을 사용하지만 반복자가 없습니다. Set::IntSpan.. 대신 -을 사용하지만, 에 반복기가있어서 거대한 배열을 쉽게 만들지 않고 인쇄 할 수 있습니다.

use Set::IntSpan; 

my $str = "1..100,171,398..1000"; 
$str =~ s/\.\./-/g; 
my $set = Set::IntSpan->new($str); 

for (my $i = $set->first; defined $i; $i = $set->next) { 
    print "$i\n"; # Or however you'd like to format it 
} 

내부적으로 Set :: IntSpan은 범위를 저장하므로 상당히 메모리 효율적이어야합니다. 파싱 ​​된 범위를 가져 오기 위해 spans 메서드를 사용할 수도 있습니다. 이것은 좀 더 많은 코드를 작성해야하지만 범위 내의 각 숫자에 대해 메소드 호출을 수행 할 필요가 없다는 것을 의미합니다. Perl에서의 메소드 호출은 다소 느리지 만 위의 코드가 실행되는 데 시간이 너무 오래 걸리지 않는다면 걱정하지 않아도됩니다.

+0

감사합니다. cjm. 멋지고 우아한 솔루션이지만, Set :: IntSpan은 범위가 정렬되어 있어야하며, 내 이유는 꼭 필요한 것은 아닙니다. –

관련 문제