2013-03-12 5 views
3

안녕하세요 저는 perl을 배우고 있으며 몇 가지 가정을 게시 할 예정입니다. 그러니 내가 어딘가에 틀렸다면 제게 의견을 말하고 바로 잡으십시오. 다음으로Perl - 익명 해시 맵 및 배열 - 몇 가지 질문

배열을 만들기
%numbers = qw(one 1 two 2); 
  • 이 완료 : 해시를 만들기

    1. 에 의해 (여러 다른 방법들)을 완료

      @array = qw(one two); 
      
    2. 위 구조물은 "비 익명"유형을 나타냅니다 . 비 익명 및 익명 형식의 가장 큰 차이점은 명명 된 형식에는 참조 할 수있는 이름이 있다는 것입니다. 익명 형식을 만들고 싶다면 배열의 대괄호 []에 대해 괄호 ()을 변경하거나 해시로 중괄호 {}을 변경해야합니다. 해시의 해시는 다른 해시에 대한 참조의 해시입니다. 따라서 중첩 해시에 {}을 사용해야하며 기본 해시가 아닌 ()을 사용해야합니다.

      %HoH = (
          flintstones => { 
           husband => "fred", 
           pal  => "barney", 
          }, 
          jetsons => { 
           husband => "george", 
           wife  => "jane", 
           "his boy" => "elroy", # quotes needed on key. 
          }, 
          simpsons => { 
           husband => "homer", 
           wife  => "marge", 
           kid  => "bart", 
          }, 
      ); 
      
    3. 다차원 배열에도 동일한 상황이 적용됩니다. 다차원 배열은 다른 배열에 대한 참조를 포함하는 배열이므로 []를 대신 사용해야합니다().

      @array_of_arrays = ([ "one", "two", "three" ], 
               [ 4, 5, 6, 7 ], 
               [ "alpha", "beta" ] 
              ); 
      
    4. 나는 각 가족 구성원을 포함하는 "비 익명"해시 한 경우 (flinstones, jetsons을, 심슨) 내가 %HOH을 만드는 데 사용해야하는 건설?

      $HOH{flinstones} = {%flinstones}; 
      

      또는

      $HOH{flinstones} = \%flinstones; 
      

      내가 \%flinstones 단순히 $HOH{flinstones}에 대한 참조를 할당하는 것을 가정하고,이 내가 %flinstones에 무엇 이건 단순히 그것을 참조가 포함되어 있기 때문에 $HOH{flinstones}에 영향을 미치는 것을 의미합니다. 반면에 {%flinstones}은 "익명"해시에 대한 "익명"해시를 다시 캐스팅하는 것과 같습니다. 나중에 %flinstones을 수정하거나 삭제할 수 있으며 익명 해시에 대한 참조가 있으므로 $HOH{flinstones}에 영향을 미치지 않습니다.

    5. variable in loop는 어떻게됩니까? 루프 내에서 my $variable;이 실행되면 이전의 변수를 덮어 쓰거나 새로운 변수를 작성하거나 동일한 변수입니까?

      for($i=0;$i<4;$i++){ 
          my $variable=$i; 
          print $variable 
      } 
      
  • +2

    질문 당 하나의 질문 만해야합니다. – TLP

    답변

    1

    나는 "문자 해시", "문자 배열"을 부르지 만, 각각 자신의.

    당신은 Perl에서 - tie의 경우를 제외하고는 - [...]\@x가 거의 같은 것을 알아야합니다. 그리고 {...}\%h도 마찬가지입니다. 그들은 배열과 해시에 대한 참조를 "구성"합니다.

    질문 5, 둘 다 당신이 원하는대로 할 것입니다. 그러나 하나가 더 효율적으로 수행 할 것입니다. 두 번째 예제는 이미 정의 된 해시에 대한 참조를 다른 해시의 값으로 저장합니다.첫번째 예는,

    $HOH{flinstones} = {%flinstones} 
    

    어드레스를 반환 해시를 생성하고 목록 콘텍스트 당리스트로 %flintstones 확장. 따라서 %flintstones의 정확한 복사본 인 해시를 %HOH에 저장된 별도의 해시에 저장합니다. %flintstones의 변경 사항은이 사본에 영향을주지 않습니다.

    여기에 약간의 조언이 있습니다. Smart::Comments (SC)을 설치하고 일부 테스트 스크립트를 작성하고 STDERR을 통해 변수 내부를 덤프하십시오. 모든 것을 내부에서 볼 수 있다는 것을 얼마나 많이 배울 수 있는지 놀랄 것입니다. 여기

    는 SC 내 경험에서 교훈입니다

    • 어떤 양의 정수 값으로 $Data::Dumper::Maxdepth을 설정 당신이처럼 보일 수 있습니다 같은 OLE 개체의 각 기준으로, Win32::OLE 개체를 덤프 거라면 통과 할 때 다른 Perl 객체.

    • $_을 단독으로 사용하지 마십시오. 어떤 이유로 SC의 코드가이를 변경할 수 있습니다. 그래서 항상 다음과 같이하십시오.

      my $a = $_; 
      ### $_ : $a 
      
    • IO 핸들은 덤프하지 않으므로 시도하지 마십시오. 기본 문자열을 사용하십시오. 간단한 변수 덤프를 통해 - - 당신이 %HOH%flintstones를 덤프하지 않은 경우

    지금, 마지막으로, 당신은 알 방법이 없습니다 참조가 동일하거나하지되었는지. 그러나 $Data::Dumper::Maxdepth을 설정하면 완전한 덤프를 얻을 수 없습니다. 따라서 두 개의 참조가 부분적으로 덤프되고 참조의 일반적인 일반 Perl 문자열 화를 사용하여 두 개의 참조가 같은지 여부를 테스트 할 수 있습니다.

    ### %flintstones : '' . \%flintstones 
    local $Data::Dumper::Maxdepth = 1; 
    ### %HOH 
    

    당신이 어떤 사건인지 직접 확인해 보면 Stackoverflow에서 많은 질문을하는 것보다 펄을 빨리 배우는 데 도움이 될 것입니다.

    3

    질문 1은 질문 1로 가정하고 둘 다 사용할 수 있습니다.

    $HOH{flinstones} = {%flinstones} 
    

    단순히이의 키와 값의 목록으로 확장되고 %flinstones 해시의 단순 복사본을하고있다 : 당신은 첫 번째 방법을 실현해야하지만. 반면에

    해시를 참조로 전달하므로 두 해시 모두 메모리의 동일한 위치를 가리 킵니다.

    질문 6과 같이 어휘 범위 변수는 어떻게됩니까? perldoc -f my 살펴 보도록하자 : 용 루프

    A "my" declares the listed variables to be local (lexically) to 
    the enclosing block, file, or "eval". 
    

    A는 블록 임의의 변수는가 루프 그 루프 로컬 내부 my 선언하고, 그 루프의 각 반복에 국부적 것을 의미한다.어떤이 뭔가를 할 경우 의미합니다 :

    for my $number (0 .. 3) { 
        print "Number is $_. Last number was $last\n"; 
        my $last = $_;      # WRONG! 
    } # $last goes out of scope here! 
    

    그것은 당신에게 Use of uninitialized value 경고를 많이 줄 것이다. 이것은 당신의 부분에 의도적 인 경우 나도 몰라, 이제

    my $last = "N/A"; # default value 
    for my $number (0 .. 3) { 
        print "Number is $_. Last number was $last\n"; 
        $last = $_; 
    } 
    

    ,하지만 당신은 하나에 이러한 질문을 모두 결합 할 수 있습니다 : 당신은 범위를 확장 할 필요가

    my %HOH; 
    { # begin a block to reduce scope of variables 
        my %flinstones = (
         husband => "fred", 
         pal  => "barney", 
        ); 
        $HOH{flinstones} = \%flinstones; 
    } 
    ... # %flinstones hash is now out of scope, stored only in %HOH 
    
    1

    { LIST } 건설 (같은 목록을 %hash = (LIST)으로 명명 된 해시에 할당 한 것처럼) 값 목록을 가져 와서 익명 해시를 만들고 그 해시에 대한 참조를 반환합니다.

    "익명의 해시"에 대해서는 특별한 것이 없습니다. 다른 사람들과 마찬가지로 평범한 해시입니다. 그 (것)들을 "익명"하게 만드는 유일한 방법은 (현재) 이름이 없으므로 참조를 사용하여 참조 할 수 있습니다.

    변수 이름에 바인딩되는 것은 해시의 본질적인 속성이 아닙니다. 이름이 지정된 해시가 익명이 될 수 있습니다 (예 : 이름이 범위를 벗어나는 경우) 또는 익명 해시가 될 수도 있습니다. 이 같은 symbol table manipulation를 통해 이름을 취득 : 라인 *hash = $hashref

    my $hashref = {foo => 'bar'}; 
    our %hash;    # required by "use strict" 
    *hash = $hashref; 
    print "$hash{foo}\n"; # prints "bar" 
    

    를 전역 변수 %hash 해시의 새 이름에 관계없이 이미 전에 여부의 이름을 가지고 있는지 여부의 기준 $hashref 가리키는된다 . 이 메커니즘은 심지어 같은 해시가 둘 이상의 이름을 가질 수있게 해줍니다 : 사실, 해시 (또는 다른 종류의 변수)를 자신의 네임 스페이스에서 본질적으로 내 보냅니다 모든 Perl 모듈은 본질적으로 이것을 수행합니다.

    물론 위의 모든 내용은 배열에도 적용됩니다 (물론 실제로 스칼라에도 적용됩니다). 사실 당신의 마지막 질문에 대해서는


    , my 새로운 어휘 범위 변수를이 실행 것마다 작성하지 않고 동일한 변수 각 시간을 재사용하는 것보다. 이것은 실제로 예제 코드에 아무런 차이가 없지만 이되는 한 상황은이 범위를 벗어나기 전에 변수에 대한 참조를 저장 한 경우 차이가 발생합니다. 이 코드는 실제로 지금 (다른 익명에 대한 참조로 @table를 채운다이 테스트 경우

    my @table; 
    while (my $line = <>) { 
        chomp $line; 
        my @row = split /\t/, $line; 
        # maybe do some manipulation or checks on @row here... 
        push @table, \@row; 
    } 
    

    , 당신은 찾을 수 있습니다 : 예를 들어, 다음은 배열에 탭으로 구분 된 데이터를 분석 할 수있는 매우 일반적인 방법입니다) 배열을 참조해야합니다.