perl - 在 Perl 中使用 foreach 代替 map 和 grep
问题描述
我正在尝试将map
andgrep
代码完全转换为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 代码中没有得到相同的输出。
有人可以帮助我哪里出错了吗?
解决方案
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;
}
您只是将一些Saash Techs
赞助商更改为Saash
in @events
,这就是我首先进行修复的原因。@events
像你一样偷偷摸摸地改变是一种不好的做法。
推荐阅读
- r - dplyr 未正确分组或使用先前组中的数据
- c# - 使用生产数据库作为内存数据库进行集成测试
- windows-10 - 在 Windows 10 中启用 ip 转发和设置 nat 伪装
- jquery - 调整窗口大小不适用于 JQuery 函数 - 需要刷新窗口
- pine-script - 如何使用安全功能访问系列的上一个值
- javascript - 如何使用 Google Apps 脚本将 Google 云端硬盘文件名记录到 Google 表格
- python - 在python中,我的输入提示在我回答一次后第二次打印
- java - 替换 Java 中特定模式的第一次出现
- java - 带有 MySQL 的 Spring Boot R2DBC - 异常:找不到表
- c - wake_up_interruptible 之后的内核 NULL 指针取消引用