my $xyz_fmt = '@30a7 @38a6 @46a6'; while ($pdbline = ) { if ($pdbline =~ m/ZN1 LG1 X/) { @Zn = unpack $xyz_fmt, $pdbline; next; } if ($pdbline =~ /^ATOM.*(OD2 ASP|NE2 HIS)/) { push @Atoms, [unpack $xyz_fmt, $pdbline]; ... } } # ... do the calculations once we have all data.