簡體   English   中英

在 Perl 中使用 foreach 代替 map 和 grep

[英]Use foreach instead of map and grep in Perl

我正在嘗試將mapgrep代碼完全轉換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM