Hi Yary (and Todd), Thank you both for your responses. Yary, the problem seems to be with "get". I can change 'while' to 'for' below, but using 'get' raku/perl6 actually returns fewer lines with "for" than it did with "while":
[1]mydir$ cat testthis_abc_def.txt a b c d e f [2]mydir$ perl6 -e '.say while $_ = $*IN.get;' < testthis_abc_def.txt a b c [3]mydir$ perl6 -e '.say for $_ = $*IN.get;' < testthis_abc_def.txt a I assumed 'get' was looking at EOF but that's incorrect--apparently 'get' acts more like a glorified call to lines[0], reading one line of an input file and then stopping. I can read my whole test file by explicitly testing for EOF (note the redeclaration of $*IN below). Otherwise, my best course of action is replacing 'get' with 'lines', and using either 'while' or 'for' ('.say for $*IN.lines;' replicates 'cat' behavior the best): [4]mydir$ perl6 -e 'while not($*IN.eof) -> {$*IN.get.say };' < testthis_abc_def.txt a b c d e f [5]mydir$ perl6 -e '.say while $_ =$*IN.lines;' < testthis_abc_def.txt (a b c d e f) [6]mydir$ perl6 -e '.say for $_ = $*IN.lines;' < testthis_abc_def.txt (a b c d e f) [7]mydir$ perl6 -e '.say for $*IN.lines;' < testthis_abc_def.txt a b c d e f HTH, Bill. On Sat, Jan 18, 2020 at 5:55 PM yary <not....@gmail.com> wrote: > > "while" is the wrong looping construct for going over file lines, and that's > across a great many computer languages. It will stop when it encounters a > false line- typically an empty line or '0' > > Try "for" > > -y > > > On Sat, Jan 18, 2020 at 4:45 PM William Michels <w...@caa.columbia.edu> wrote: >> >> Hello All, >> >> I've been reviewing literature that discusses using raku/perl6 as a >> replacement for common unix utilities. One important unix utility is >> "cat". I looked at docs/blogs and found a recommendation to use "$*IN" >> along with "slurp" (references at bottom). Using a seven-line test >> file "testthis_abc_def.txt" below (1), the recommended "slurp" code >> works as expected (2). >> >> However, another recommendation to use "$*IN" along with the "get" >> method fails when a blank line is encountered, only returning >> truncated output (3). I tried correcting truncated output seen with >> "get" by playing with the command-line arguments "-ne" (4) and "-pe" >> (5), but only ended up mangling output even further. >> >> Can "get" be used in when writing raku/perl6 replacement code for "cat"? >> >> Any advice appreciated, >> >> Bill. >> >> >> [1]mydir$ cat testthis_abc_def.txt >> a >> b >> c >> >> d >> e >> f >> [2]mydir$ perl6 -e 'say $*IN.slurp;' < testthis_abc_def.txt >> a >> b >> c >> >> d >> e >> f >> >> [3]mydir$ perl6 -e '.say while $_ = $*IN.get;' < testthis_abc_def.txt >> a >> b >> c >> [4]mydir$ perl6 -ne '.say while $_ = $*IN.get;' < testthis_abc_def.txt >> b >> c >> e >> f >> [5]mydir$ perl6 -pe '.say while $_ = $*IN.get;' < testthis_abc_def.txt >> b >> c >> >> e >> f >> (Mu) >> [6]mydir$ >> >> >> REFERENCES: >> 1. https://docs.raku.org/routine/slurp >> 2. https://docs.raku.org/routine/get >> 3. https://andrewshitov.com/2019/09/09/the-cat-utility-written-in-perl-6/ >> 4. >> https://stackoverflow.com/questions/52597984/catching-exception-of-a-shell-command-in-perl-6