Untested:
$str = " ... "; # The data you posted
my @data;
foreach my $line (split /\n\s*/, $str) {
if (/^MAC Address:\s*(\S+)/) {
push @data, {mac_address => $1}
}
elsif (/^IP addr:\s*(\S+)/) {
$data[-1]{ip_address} = $1;
}
elsif (/^Link Speed:\s*(\S+)/) {
$data[-1]{link_speed} = $1;
}
elsif (/^Link Cost:\s*(\S+)/) {
$data[-1]{link_cost} = $1;
}
}
printf "Node with MAC Address: %s has IP = %s and Link Speed = %s and
+Link Cost = %s\n",
$_->{mac_address}, $_->{ip_address}, $_->{link_speed}, $_->{li
+nk_cost} for @data;