Всем привет!
Ломаю голову..Есть JSON:
print Dumper($json);
$VAR1 = [
{
"id" : "1",
"name" : "Name1"
},
{
"id" : "2",
"name" : "Name2"
},
{
"id" : "3",
"name" : "Name3"
}
]
Список может быть большойИх него нужно вытащить все элементы "name" и запихнуть их в одномерный массив: @names = ("Name1", "Name2", "Name3")
Первое что приходит в голову:
for my $elem ( @$json ){
push @names, $elem->{"name"};
}
print Dumper(@names);Ну, имеем то, что хотели:
#Name1Name2Name3ВОПРОС
Есть способ получить желаемое в одно касание, без перебора? По типу, как взять 1 элемент:
$name = $json->[0]->{"name"};
так хотелось бы сразу все "name"Спасибо.
> ВОПРОС
> Есть способ получить желаемое в одно касание, без перебора? По типу, как
> взять 1 элемент:
> $name = $json->[0]->{"name"};
> так хотелось бы сразу все "name"
> Спасибо.Э... это _должно_ называться map(). Я почти :) уверен.
Перла не знаю, "но вы держитесь":
$ dat() { echo '[ -- json SKIPPED --]'; }
$ dat |jq '[.[].name]'
[
"Name1",
"Name2",
"Name3"
]
$ dat |jq 'map(.name)'
[
"Name1",
"Name2",
"Name3"
]
$ _
> Э... это _должно_ называться map(). Я почти :) уверен.да, есть это
print join("," , map{ $_->{name}} @{$json});
> Перла не знаю, "но вы держитесь":
скромничаешь! хых ))
и всё-то ты знаешь
> print join("," , map{ $_->{name}} @{$json});Подитожу:
@names = map{$_->{name}} @{$json};
или
@names = map{$_->{name}} @$json;
> Всем привет!
> Ломаю голову..
> Список большой
> Есть способ получить желаемое?
> И хотелось бы сразу всё!
> Спасибо.Ok google!
Как сделать мне хорошо и красиво?
Без перебора только так. Регулярку не проверял.my @names = $json_str =~ m/name["\s]*:\s*"([^"]+)/g ;
> Без перебора только так. Регулярку не проверял.
> my @names = $json_str =~ m/name["\s]*:\s*"([^"]+)/g ;не взлетит
> не взлетит
#!/usr/bin/perluse strict;
use warnings;
use JSON;
use Data::Dumper;
use Benchmark 'cmpthese';my $json_text = '[
{
"id" : "1",
"name" : "Name1"
},
{
"id" : "2",
"name" : "Name2"
},
{
"id" : "3",
"name" : "Name3"
}]'
;#my $json = JSON->new->decode($json_text);
my $json = decode_json($json_text);print Dumper($json);
sub mapng {
my @names = map { $_->{name} } @{$json};}
sub modif {
push my @names, $_->{name} for @{$json};
}sub cycle {
for ( @{$json} ) {
push my @names, $_->{name};
}
}
sub ptext {
my @names = ($_[0] =~ /^\s*+"name" *+: *+"([^"]*+)"/mg);
# print Dumper(@names);
}
#ptext($json_text);cmpthese(
-1,
{
'mapng' => sub { mapng($json) },
'modif' => sub { modif($json) },
'cycle' => sub { cycle($json) },
'ptext' => sub { ptext($json_text) },
}
);
__END__
ptext 92781/s -- -63% -67% -67%
mapng 251601/s 171% -- -11% -12%
cycle 281553/s 203% 12% -- -1%
modif 284630/s 207% 13% 1% --Если правильно понял
еще до кучи:
push @names, $_->{name} for @$json;
> еще до кучи:
> push @names, $_->{name} for @$json;в данном случае for используется как модификатор, но суть дела от этого не меняется
и это фактически, да и практически ничем не отличается от классического перебора в циклеfor ( @{$json} ) {
push @names, $_->{name};
}написано короче,
но ещё не известно, что быстрей и лучше для понимания и восприятия
(в данном конкретном случае) ))
дело было вечером, делать было нечего,
было скучно..вспомнил бородатый анекдот дневник джигита (абрека),
захотел вернуться к этому и выяснить, что быстрее работает,
потому как map тоже является циклом, только хитрозаточенным,
в отличии от for (foreach) и, думаю, не очень его быстрееи чтобы хейтеры (не путать с хипстерами) не начали своё любимое
"пруф или трепло", решил - хайпанём, немножечко? ))вот proof, сиречь доказательство
#!/usr/bin/perluse strict;
use warnings;
use JSON;
use Data::Dumper;
use Benchmark 'cmpthese';
my $json_text = '[
{
"id" : "1",
"name" : "Name1"
},
{
"id" : "2",
"name" : "Name2"
},
{
"id" : "3",
"name" : "Name3"
}]'
;#my $json = JSON->new->decode($json_text);
my $json = decode_json($json_text);print Dumper($json);
sub mapng {
my @names = map { $_->{name} } @{$json};}
sub modif {
push my @names, $_->{name} for @{$json};
}sub cycle {
for ( @{$json} ) {
push my @names, $_->{name};
}
}
cmpthese(
-1,
{
'mapng' => sub { mapng($json) },
'modif' => sub { modif($json) },
'cycle' => sub { cycle($json) },
}
);__END__
что видим?
что так и да, mapping быстрее, но не в разы
# ./test.pl
$VAR1 = [
{
'name' => 'Name1',
'id' => '1'
},
{
'name' => 'Name2',
'id' => '2'
},
{
'name' => 'Name3',
'id' => '3'
}
];
Rate mapng cycle modif
mapng 239064/s -- -8% -9%
cycle 260979/s 9% -- -1%
modif 262926/s 10% 1% --
выигрыш по скорости небольшой, всего лишь код немного короче (красивее? ;) ),
(думаю, что map выгоден для обработки и трансформации массива в другой массив)такие дела
блин, опять скучно..
Наверное ответ был на этот пост