Perl의지도에서 해시프 목록을 반환하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1403607

  •  05-07-2019
  •  | 
  •  

문제

다음은 대부분 OK 코드를 가지고 있습니다.

my $results = { data => [
   map {
      my $f = $_->TO_JSON;
      $f->{display_field} = $_->display_field($q);
      $f;
   } $rs->all
]};

오히려 오히려 다음과 비슷했습니다.

my $results = { data => [
   map {
      %{$_->TO_JSON},
      display_field => $_->display_field($q),
   }, $rs->all
]};

그러나 그것은 구문 오류를 제공합니다. 내가 원하는 것을 어떻게 할 수 있습니까? 아니면 현재 버전이 최선을 다하는 것입니까?

업데이트: 이전의 여분의 세미콜론에 대해 죄송합니다. 여기 늦었 어. 내가 어떻게 놓쳤는 지 잘 모르겠습니다. 감사합니다!

도움이 되었습니까?

해결책

Perl 이후 쉼표를 생략해야한다고 생각하기 때문에 구문 오류 만 제공합니다. map { ... }, 그것은 그 맵을 표현이 아니라 블록으로 구문 분석하기 때문입니다. 퍼팅 + 앞에는 그것을 고칠 것입니다. 또한 익명 해시에서 세미콜론을 가질 수 없습니다.

my $results = { data => [
   map +{
#      ^----------------- plus sign added
      %{$_->TO_JSON},
      display_field => $_->display_field($q);
#                                           ^---- should be comma or nothing
   }, $rs->all
]};

다른 팁

문제는 Perl이 { "익명 해시 참조 시작"또는 "코드 블록 시작"을 의미합니다. 그것 ~해야 한다 (이상적으로) 해당 지역을 찾으십시오 } 그리고 쉼표가 있는지 여부를보고 그에 따라 행동하지만 그렇지 않습니다. 그것은 조금 앞서 보이고 추측하려고합니다. 그리고 이번에는 잘못되었고, 당신은 그것을 움직이지 않아야한다는 점을 제외하고는 존재하지 말아야 할 쉼표에 대한 구문 오류를 얻습니다.

perldoc -f map 이것에 대해 모두 말할 것입니다. 기본적으로, 그것은 당신이 넣으면 말합니다 +{, Perl은 이것이 "코드 블록이 아님"을 의미하며 해시 참조라고 추측합니다. 이것은 아마도 구문 오류의 원인 일 것입니다. 또 다른 제안으로 말하면 효과가있을 수 있습니다 map({ HASH STUFF }, $rs->all) - 돈 펄이 여기서 코드 참조라고 생각하지 않을 것입니다.

나는 그것을 일할 수 없었지만 $rs 또는 a ->TO_JSON 또는 변수 명명 $q 어쨌든이 일을 할 수 없었습니다. 이게 도움이 되길 바란다. 그렇지 않은 경우 코드를 조금 더 게시하십시오. 걱정하지 마세요, 우리는 물지 않습니다.

또한, 우리가 그에있는 동안 이런 식으로 쓰지 않겠습니까?

my $results;
$results->{data} = [ map MAGIC MAP STUFF, $rs->all ];

특히 많은 것을 추가하는 경우 더 읽기 쉬울 수 있습니다. $results 한 번에 모두.

어떤 종류의 구조를 찾고 있는지 잘 모르겠습니다. 그만큼 map 첫 번째 예에서는 이미 해시프 목록을 반환합니다 (모든 버전 $f).

두 번째 예제와 비슷한 구문을 원한다면 거의 옳았습니다. 지도 블록에서 외부 세미콜론을 제거하고 한 쌍의 컬리를 사용하여 익명 해시 참조를 만들어야합니다.

같은 것 :

my $results = { data => [
    map { { %{$_->TO_JSON},
            display_field => $_->display_field($q)
          }
    } $rs->all
]};

나는 항상 블록 양식으로 맵을 사용하고 코드를 구조화하여 쉽게 선택할 수 있습니다. 표현 양식을 사용하기 위해 오프닝 곱슬 앞에 A +를 넣을 수 있지만 실제로 그렇게 중요합니까?

다른 모든 일을 제외하고 첫 번째 예는 괜찮아 보입니다. 계속해서 실제 문제를 해결하십시오. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top