2009-11-02 3 views
11

Perl이 문자열을 색인화하기 위해 일반 [] 연산자를 지원하지 않는 이유는 무엇입니까?Perl이 문자열을 색인화하기 위해 일반 [] 연산자를 지원하지 않는 이유는 무엇입니까?

거의 모든 주요 프로그래밍 언어가이 연산자를 지원합니다. 특히 다른 두 개의 'P'는 Python과 PHP입니다. 또한,이 작은 구문을 구현하는 것이 쉬워야한다고 생각합니다. 또한 Perl 프로그래밍 언어의 철학으로서 - 우리가 할 수있는만큼 게으르다. 그렇다면 왜 문자열을 색인화하는 함수를 사용하는 것이 싫은가?

Perl 6은이 구문을 지원합니까?

+2

이것은 기능이 아닙니다. 그것은 단지 구문입니다. – postfuturist

+4

'[]'에 대해 '정상적인'것은 없습니다. 그뿐만 아니라'[]'는 구문에도 불구하고 함수로 구현 될 수도 있고 구현되지 않을 수도 있습니다 (예를 들어, Ruby의 [[]는 실제로 메소드입니다). – rfunduk

+3

사이드 노트 : Perl, Python, PHP가 어떤 기능이나 구문을 공유 할 필요는 없습니다. 이 세 언어는 매우 다른 구문, 매우 다른 의미, 매우 다른 디자인 목표를 가지고 있습니다.당신이 그 (것)들이 동일 하 것이라는 점을 예상하는 경우에, 당신은 큰 실의를 위해 안으로이다. (예를 들어, Haskell에서 문자열에서 n 번째 문자를 추출하는 연산자 또는 임의의 목록에서 n 번째 항목을 추출하는 연산자는'$$'입니다. 아무도 Haskell이 그 목적을 위해'[] '를 사용하지 않는다고 불평하지 않습니다. .) –

답변

45

나는 지금까지 모든 대답을 좋아하지만, 진정한 대답은 "래리가 그렇게 원하기 때문에"입니다. 정말. 래리 (Larry)는 그를 위해 일하는 관용구와 도구를 생각해 냈고, 그는 Perl의 형식으로 우리와 공유했습니다. 래리가 생각하는 방식을 생각하지 않는다면 사용할 다른 도구가 많이 있습니다. 우리는 Perl을 사용하여 전 세계를 필요로하지 않습니다 ... 래리가하는 방식대로 "이해"하는 사람들.

+0

네,하지만 래리의 이론적 근거는 무엇입니까? 어쩌면 당신은 어떤 통찰력을 가지고 있을까요? –

18

바이트, 문자 또는 그래프로 인덱싱 하시겠습니까? 이것은이 될 수있는 소스 텍스트에 따라 시간

  • chars
    에서

    • bytes
      정확히 하나의 바이트 :

      이는 펄 6 length is "banned"에, 대신 다음 중 하나를 사용하는 이유 1 바이트 또는 몇 바이트.

    • graphs
      이것은 문자와 유사하지만 여러 "결합"문자를 결합합니다.

  • 당신은 정말 당신이 split을 사용하여 비슷한 작업을 수행 할 수 있습니다합니다.

    (split '', $str)[$index]; 
    

    그냥하지만 ​​substr를 사용하는 것이 좋을 것입니다.

    substr $str, $index, 1; 
    
    +0

    필자는 불필요한 익명 목록을 만들지 않도록'(split //, $ str) [$ index]'를 작성 했었지만 둘 다 이상하게 보입니다. 그렇지 않습니까? 'substr ($ str, $ index, 1)'(또는'$ str.substr ($ index, 1)', Perl 6)은 가독성이 가장 좋은 도구 일 것입니다. – ephemient

    +1

    "split undef"로 혼란 스러울 때 split은 // - 표기법 (예 :'split/foo /')이나 정규 표현식으로 해석되어야하는 표현식 (예 :'split "fo")을 취할 수 있습니다. "o"). undef는 빈 문자열로 승격되고 정규 표현식으로 컴파일되어 "초기화되지 않은 값 사용"경고를 제외하고는'split //'과 같은 결과를 낳습니다. (다른 차이점은 perl이 한 번만 쓰는 대신 split이 실행될 때마다 정규 표현식을 컴파일해야한다는 것입니다.) – ysth

    +0

    'split //, ... 대신'split ', ...'을 사용했습니다. '코드 하이 라이터의 문제점 때문에. –

    7

    Perl에서 문자열은 스칼라이므로 기본적으로 subscriptable이 아닙니다. substr() 또는 index()과 같은 기능을 사용하여 문자열의 특정 문자에 액세스 할 수 있습니다.

    Perl 6이 문자열을 char 배열로 변경하여이 개념을 위반하지 않는 한, 이것에 대한 변경이있을 것이라고 생각하지 않습니다.

    +0

    Perl 6에서는 스칼라가 객체이기 때문에 같은 것을하는 메소드가있을 수 있습니다. –

    +0

    나는 기존의 모든 것들을 망가 뜨리지 않는 한 변경을 위해 열었습니다;) – Shirkrin

    +0

    'autobox'를 사용하고'[] '연산자를 무시하면 마술과 함께 할 수 있습니다. – Ether

    12

    Perl에는 index 또는 substr으로 문자열을 인덱싱하는 방법이 있습니다. 그것은 작업을 지원합니다. 다른 구문으로 처리한다는 것은 중요하지 않습니다. 우리에게는 하나 이상의 프로그래밍 언어가있는 이유가 있습니다. :)

    저는 []가 "정상적인"연산자라고 말하지 않습니다. 나는 사람들이 그렇게하지 않는 많은 언어들을 나열 할 수있을 것이라고 확신한다.

    +0

    "다른 구문"을 설명하는 줄을 추가하는 데 도움이됩니다 –

    +0

    브라이언의 대답에 대해 불평하는 사람이 부끄러워하는 부분이 있습니다. :) 브라이언의 대답을 편집하여 아래 주석에 제안 된 구문을 포함시킵니다. – DVK

    +0

    ... BTW, 아이러니 한 이유는 브라이언이 다른 사람들의 가장 많은 편집자 인 것처럼 보이기 때문입니다. Perl Qs와 As. – DVK

    23

    []을 문자열에 색인화하는 것은 많은 프로그래밍 언어가 문자열을 처리하는 방식의 부작용입니다. 문자 배열 (또는 유니 코드의 경우 넓은 문자)입니다. Perl에서 문자열은 일류 항목입니다. Perl은 전체 문자열을 단일 값으로 처리하는 다양한 방법을 제공합니다. 문자열에 색인을 붙이려고한다면 아마도 잘못된 것을하고있을 것입니다. (예를 들어 Perl 관용구를 사용하는 대신 Perl로 C를 작성하는 것) 실제로 문자열로 색인해야하는 경우는 substr을 사용하십시오.

    +5

    문자열이 일류 엔터티 (단순한 문자 배열이 아니라)라는 말은 구문 적으로 배열로 처리 할 수 ​​없다는 것을 의미하지는 않습니다. 예를 들어 Java, C# 및 Delphi를 참조하십시오. –

    9

    스칼라를 객체로 취급하려면 autobox을 사용할 수 있습니다.

    나는 autobox를 사용하지 않는,하지만이 작동합니다 :

    my $indexed = ('foo'->list)[1]; 
    

    autobox는 다양한 데이터 유형을 포장에 사용하는 객체를 정의하는 후크가 있습니다. 당신이 정말로, 정말로 원하는 경우

    그래서,이 같은 코드 수 있도록 그 자신의 문자열 클래스를 만들 autobox을 사용할 수 있어야합니다 : 그래서

    my $indexed = 'foo'->[3]; 
    

    을, 나는 당신의 질문에 대한 답을 생각한다 "왜 Perl은 문자열 색인을위한 구문을 가지고 있지 않습니까?" "아무도 그것을 구현하기에 충분하지 않았다."

    Perl 6에서는 "존재하지 않고 실제로 원한다면 직접 추가 할 수 있습니다."이상의 대답을하기에 충분히 밀접하지 않았습니다.

    +2

    그것은 Perl 6에는 존재하지 않지만, 다중 메서드 postcircumflex : <[ ]> (Str, Int)'을 정의 할 수 있어야한다고 생각합니다. (Rakudo가 아직 지원하지 않기 때문에 확인할 수는 없지만). – ephemient

    7

    문자열의 이름은 무엇입니까? 스칼라이므로 sigil은 분명히 $입니다. 나머지는 표준 변수 명명 표준을 따릅니다. $abc을 예로 들어 보겠습니다. sigils는 식의 상황의를 의미하고, 이름의 일부가 아닌 것처럼

    my $abc = 'A string'; 
    

    , 우리는 충돌이있다.

    my $def = $abc[2]; 
    

    스칼라 $abc의 3 문자 있지만 어레이의 세 번째 요소 아니다 - 동일한 심볼을 공유하는 (그러나 다른 인장으로) @abc.

    스크립트 식 심볼 분해를 위해 초기에 설계된 표현식에는 이미 의미가 할당되어 있습니다.

    물론, Brad 's 답은 "문자열"의 일부를 "목록"의 "항목"으로 만드는 것에 대해 암시 적으로 가정 할 경우에만 의미가있을 수 있습니다. 더 많은 인코딩을 사용해야 할 경우 이러한 기본 가정이 악용됩니다. (. 당신은 ch를 직접 작성해야)

    $string->ch(2); 
    

    는하지만 반드시 단순히 문자열에 브래킷의 퍼팅보다 더 장황 :

    autobox를 사용하여 당신은 당신이 선호하는 구문을 찾을 수 있습니다.

    관련 문제