Perl의지도에서 해시프 목록을 반환하려면 어떻게해야합니까?
문제
다음은 대부분 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 +를 넣을 수 있지만 실제로 그렇게 중요합니까?
다른 모든 일을 제외하고 첫 번째 예는 괜찮아 보입니다. 계속해서 실제 문제를 해결하십시오. :)