in reply to Lexical scope

  1. return should always (except in a few special situations) be within a sub. Where do you expect the line return @records; to return to?
  2. The first two lines of sub events seem to be misplaced.
  3. my ($n, @list); ($n, @list) = @_;

    is better written

    my ($n, @list) = @_;
  4. foreach $_ (@list) is just wrong. Use either foreach (@list) or
    foreach my $item (@list) { my @tokens = split ' ', $item; ...
  5. Reusing the same name for variables in the same area of code (@list for example) is at best confusing and at worst is completely wrong - don't do that
True laziness is hard work

Replies are listed 'Best First'.
Re^2: Lexical scope
by velocitymodel (Acolyte) on Apr 14, 2011 at 20:33 UTC

    Thank you for your advice. I am still lost however on how to handle my array @records and call it outside the while block to be printed. I tried using our but encountered and error and I don't think I fully understand how to use our. Would using a package variable be okay in this situation? Thanks again.

      Your code is a complete train wreck so I'm not going to even try and guess where your head is at. Instead, working from your specification, I guess you want something like:

      use strict; use warnings; while (defined (my $header = <DATA>)) { my @parts = split ' ', $header, 17; next if @parts < 12; processEvent (); print join (' ', @parts[3, 4, 6, 5, 7, 8, 11]), "\n"; } sub processEvent { <DATA>; for (1 .. 8) { my $line = <DATA>; last if ! defined $line; my @parts = split ' ', $line; splice @parts, 3, (@parts - 3) if @parts > 3; s/[^\d\s.]+/ /g for @parts[1 .. $#parts]; s/^\s+|\s+$//g for @parts; print join (' ', @parts), "\n"; } } __DATA__ 82 2 22 1043 54.7 48.020 114.037 17.5 3.2 2.9 13 177 84.3 0.20 +1.6 2.7 C MBMG * 3.1 KALISPELL VALLEY; FELT 3.07 82022210 BUT EP4432.804ES60.7 LRM IPD4435.40 IS67.2 180. AMM IPD4429.50 ES57.3 133. MSO EPC4415.90 ES32.3 CMT EP4430.50 IS58.3 LDM IPC4412.20 ES24.3 3 RXF EPC4414.3 CLX IPC4408.70 ES19.7

      which prints:

      BUT 4432.804 60.7 LRM 4435.40 67.2 AMM 4429.50 57.3 MSO 4415.90 32.3 CMT 4430.50 58.3 LDM 4412.20 24.3 RXF 4414.3 CLX 4408.70 19.7 1043 54.7 114.037 48.020 17.5 3.2 177

      Note that this code is not at all robust and depends on the event records' layout being consistent.

      True laziness is hard work

        Thank you for all your help. I apologize for the confusing code. Thanks again.