2011-04-24 4 views
3

qw{}은 목록을 작성하는 멋진 방법입니다. 단어를 보간하는 유사 항목이 있습니까? 즉 변수를 확장합니까? perlop에는 아무런 언급이 없습니다.보간 방식의 단어 목록 연산자가 삽입되어 있습니까?

+0

아니요, 내장은 없지만 많은 사람들이 우리 자신을 씁니다. 또한 라인리스트를위한 두 종류의''ql()'필요성에 대해서. 나는'q()'버전과'deQQ'를'deq'로 사용합니다. – tchrist

답변

6

아니요, 내장은 없지만 많은 사람들이 우리 자신을 작성합니다.

두 종류의 ql()에 대해서도 라인 목록이 필요합니다.

sub dequeue($$) { 
    my($leader, $body) = @_; 
    $body =~ s/^\s*\Q$leader\E ?//gm; 
    return $body; 
} 

sub deQ($) { 
    my $text = $_[0]; 
    return dequeue q<|Q|>, $text; 
} 

sub deQQ($) { 
    my $text = $_[0]; 
    return dequeue qq<|QQ|>, $text; 
} 

나 같은 물건을 사용할 수 있습니다 :

sub compile($) { 
    my $CODE = shift(); 
    my $wrap = deQQ<<"END_OF_COMPILATION"; 
       |QQ| 
       |QQ| use warnings qw[FATAL all]; 
       |QQ| no warnings "utf8"; 
       |QQ| 
       |QQ| sub { 
       |QQ|   my \$_ = shift; 
       |QQ|   $CODE; 
       |QQ|   return \$_; 
       |QQ| } 
       |QQ| 
END_OF_COMPILATION 

    return eval $wrap; 

} 

또는

펄의 "하 스타"연산자와 함께 작동하는 사람들의 qq 버전에 대한 q() 버전 deQdeQQ를 사용
 my $sorter = new Unicode::Collate:: 
          upper_before_lower => 1, 
          preprocess   => \&reduce_for_sorting, 
          entry    => deQ<<'END_OF_OVERRIDE' 
      |Q| 
      |Q|  005B 006E 002E ; [.0200.0020.0002.0391] # [n. 
      |Q|  005B   ; [.0220.0020.0002.0392] # [ 
      |Q|  005D   ; [.0225.0020.0002.0395] # ] 
      |Q| 
END_OF_OVERRIDE 

어떻게 작동하는지 확인해주세요.

+0

어떻게 작동하는지 알지만 필요한 이유는 아닙니다. heredoc은 이미 보간법을 적용하고 있는데, 왜 이것을 'deQQ'로 묶어야합니까? – Tim

+1

@Tim : 그것은 두드러지고 결과 문자열의 앞뒤 공백 또는 뛰어난 리더를 계산하지 않도록 줄 바꿈되었습니다. 코드를 읽고 유지하기가 더 쉽습니다. – tchrist

+0

나는 본다; 그건 영리한거야. 'qw()'문법을 모방하기 위해 자신 만의'qqw()'를 쓸 수 있습니까? 아니면'qqw ($)'하위로'qqw "문자열"을 얻을 것입니까? – Tim

1

그냥 :

split(' ', "$var interpolating string "); 
+0

_nice-looking way_ 기준을 충족시키지 못했습니다. :) tchrist의 게시물은 그러한 하위의 결과를 가져 왔습니다. – Tim

6

당신은 "일반"목록의 중간에 qw()을 뿌려 수 있습니다. 나는 가끔 이런 식으로 코드를 작성 :

my @command = (
    qw(cat arg1 arg2), 
    $arg3, 
    qw(arg4 arg5 arg6), 
    "$arg7 $arg8", 
    # ... 
); 
+0

이것은 실제로 대답입니다. –

2

이 ysth의 대답에 확장 :

sub qqw($) { split /\s+/, $_[0] } 

my @list = qqw"$var interpolating string"; 

주의 사항을 : 내가 처리하는 방법을 선행 및 후행 공백 모른다. 또한, 프로토 타입은 보통 서브 호출과 같이 쉼표로 구분 된 값을 여러 번 사용하지 않도록해야하지만 반드시 확인해야합니다.

관련 문제