[英]Use foreach instead of map and grep in Perl
我正在嘗試將map
和grep
代碼完全轉換為foreach
循環,但是這樣做時我遇到了麻煩。
這是獲取事件的數組代碼
my @events = [
{
Sponsor => ’Saash’,
Time => ’05:00’,
Date => ’01-03-2021’,
},
{
Sponsor => ’Saash Tech’,
Time => ’03:00’,
Date => ’01-03-2021’,
},
{
Sponsor => ’Saash Technology’,
Time => ’04:00’,
Date => ’01-03-2021’,
},
{
Sponsor => ’Saash Techs’,
Time => ’05:00’,
Date => ’01-03-2021’,
},
];
my $time = ’05:00’;
這是 grep 和 map 中使用的代碼:
my $data = [
map
{
my $hide;
if ($_->{'sponsor'}) {
$_->{'sponsor'} =~ ‘SaAsh’;
$_->{‘sponsor'} = ‘Saash’ if $_->{’sponsor’} eq 'Saash Techs';
if ($_->{‘time'} eq ’04:00’ && $_->{‘sponsor'} eq ‘SaAsh’) ) {
$hide = 1;
}
}
$hide ? () : ( $_ );
}
grep { $_->{‘time} =~ $time } @{events}
];
下面是我從 grep map 轉換為foreach
的代碼
my $data;
foreach my $event (@events) {
if ($event->{‘time’} =~ ’07:00’) {
my $hide;
if ($event->{‘sponsor’}) {
$event->{‘sponsor'} =~ ‘SaAsh’;
$event->{'sponsor'} = ‘Saash’ if $event->{’sponsor’} eq ‘Saash Techs';
if ($event->{'time'} eq '04:00' && $event->{'sponsor'} eq ‘SaAsh’) ) {
$hide = 1;
}
}
$hide ? () : ( $event );
}
}
$data = [$event];
與 grep 和 map 的代碼相比,我在 foreach 代碼中沒有得到相同的 output。
有人可以幫助我哪里出錯了嗎?
foreach my $event (@events) {
...
$hide ? () : ( $event )
}
$data = [$event];
應該
foreach my $event (@events) {
...
push @$data, $hide ? () : ( $event )
}
my @a = map BLOCK LIST;
可以寫成
my @a;
for (LIST) {
push @a, do BLOCK;
}
my @a = grep BLOCK LIST;
可以寫成
my @a;
for (LIST) {
push @a, $_ if do BLOCK;
}
當然, do
可以通過簡化和重構來去掉,在你的情況下,這兩個循環可以結合起來。 執行上述轉換和一些清理后,我們得到以下信息:
for my $event (@events) {
$event->{sponsor} = 'Saash'
if $event->{sponsor}
&& $event->{sponsor} eq 'Saash Techs';
}
my $data = [];
for my $event (@events) {
next if $event->{time} ne $time;
next
if ($event->{sponsor}
&& $event->{sponsor} eq 'SaAsh'
&& $event->{time} eq '04:00';
push @$data, $event;
}
您只是在@events
中將一些Saash Techs
贊助商更改為Saash
,這就是我首先進行修復的原因。 像你一樣偷偷改變@events
是一種不好的做法。
這是答案代碼嗎?
foreach my $event (@events) {
next if $_->{time} !~ /$time/;
if ($event->{'sponsor'}) {
$event->{'sponsor'} =~ ‘SaAsh’;
$event->{'sponsor'} = 'Saash' if $event->{'sponsor'} eq 'Saash Techs';
if ($event->{'time'} eq '04:00' && $event->{'sponsor'} eq ‘SaAsh’) ) {
$hide = 1;
}
}
push @$data, $hide ? () : ( $event );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.