cunningrat has asked for the wisdom of the Perl Monks concerning the following question:

I'm attempting to write a Perl script on the AS400. I am attempting to open and parse a stream file (CCSID 37). Here is the relevant line. I know this isn't right, but I can't seem to figure out what the right syntax would be, or if what I am trying to do is doable at all.

@contents = decode("cp37",`head -5 $wd_file`);

I have tried  open (FILE,"<:encoding(cp37)",$wd_file);. It works perfectly. Unfortunately, the files can be a couple of million lines long, and I need to examine 1 line at the beginning and three lines near the end. Processing the entire file will be slow and wasteful, especially given how perl runs on an AS400. I would really like to be able to use "head" and "tail", if at all possible.

(EDIT: yes, I am an almost complete perl neophyte.)

Replies are listed 'Best First'.
Re: encode problems on AS400
by Corion (Patriarch) on Mar 12, 2018 at 20:26 UTC

    Maybe you want to use seek to jump to a given position within the file without reading all intermediate lines?

      Thank you, that will work!

Re: encode problems on AS400
by Anonymous Monk on Mar 13, 2018 at 12:49 UTC
    In detail: seek to a point before the end of the file which you anticipate will be before the last-strings that you ... ahem ... seek. Now start reading, knowing that you probably landed right in the middle of a string (but not the string you want anyway). Read the remaining strings and, say, push them onto the end of an array. When you reach the end of the file, verify that the array contains at least three strings. An array-slice consisting of the last three strings is, in order, the data that you ... seek. (Do not stack the presumed-incomplete string that you probably landed smack-dab in the middle of ...)