use strict; use warnings; use Data::Dumper; my $completed_courses = [ { 'type' => 'core', 'name' => 'Discrete Structures', 'title' => 'CS 130' }, { 'type' => 'core', 'name' => 'Intro to Computer Science', 'title' => 'CS 140' }, { 'type' => 'core', 'name' => 'C++ Programming', 'title' => 'CS 256' } ]; my $schedule = { 'CS 130 Section 01' => { Course => 'CS 130', Time => '8:00 AM - 9:00 AM', 'Class number' => 35465, Room => '8 302' }, 'CS 140 Section 01' => { Course => 'CS 140', Time => '8:00 AM - 9:00 AM', 'Class number' => 35465, Room => '8 302' }, 'CS 256 Section 01' => { Course => 'CS 256', Time => '8:00 AM - 9:00 AM', 'Class number' => 35465, Room => '8 302' }, 'CS 241 Section 02' => { Course => 'CS 241', Time => '8:00 AM - 9:00 AM', 'Class number' => 35465, Room => '8 302' }, }; for my $done (@{ $completed_courses }){ my $title = $done->{title}; for my $section (keys %$schedule){ if ($schedule->{$section}{Course} eq $title){ delete $schedule->{$section}; } } } print Dumper $schedule; #### $VAR1 = { 'CS 241 Section 02' => { 'Class number' => 35465, 'Room' => '8 302', 'Course' => 'CS 241', 'Time' => '8:00 AM - 9:00 AM' } };