Dear Brad, Obviously there's a huge backstory to this issue, and I'm only touching base on it right now. Suffice it to say (reading posts on this mailing-list), there seems to be a bit of an "impedance mismatch" between those who know Perl versions 1 through 5, and those who come in seeking Perl_6 information without that background.
I can report that I'm seeing a Perl_5 issue with (for lack of a better word) "missing parentheses" in a blog post by Dave Cross, which I presumed would have been rectified in Perl_6: "A Subtle Bug" https://culturedperl.com/a-subtle-bug-c9982f681cb8 https://perlhacks.com/2019/01/a-subtle-bug/ Maybe it's time to unpack this in a new email thread? Certainly breaking out present/future posts into those which deal with parentheses/blocks and those that deal with "lines()" or ".lines" (there I go again), may help future readers of posts on this mailing list. Best Regards, Bill. On Tue, Aug 6, 2019 at 8:02 AM Brad Gilbert <b2gi...@gmail.com> wrote: > > The REPL (Where you see `>`) adds a `.say` if you don't print anything > yourself. > (Which makes sense since it is a Read Eval Print Loop.) > > Normal code doesn't print anything unless you tell it to. > > --- > > A bare `lines` can work, as long as it is obvious where the end of its > arguments are. > > for lines $*IN { .say } > > There is no comma or any other infix operator after `$*IN` so the `{ .say }` > is not part of the arguments to `lines`. > > --- > > The following does NOT parse the way you think it does. > > for lines ("a\nb\n") { .say } > > It is parsed the same as: > > for lines( ("a\nb\n"), ) { .say } > > Parenthesis only denote an argument list if it is immediately after the > function. > If there is space before the `()` it is seen as just a grouping construct. > > for lines () { .say } > > The `()` creates an empty list, that list is then used as the only argument > to `lines()` > > for lines( (), ) { .say } > > > List.new.lines.map( { .say } ); # <- basically the same as this > > --- > > for lines { say 'this is the block argument to lines' } but role { method > lines () { 'line 1', 'line 2', 'line 3' }} {.say} > > That prints: > > line 1 > line 2 > line 3 > > That is because the argument to `lines()` is a block with a `.lines` method, > which return those values. > > `lines()` doesn't actually care what its argument is, as long as it has a > method named `.ines`. > > Again it is obvious where the end of the argument list of `lines()` is, > because there isn't a comma after `role {}` to continue it. > > The `role {}` is part of the argument list because of the `but` infix > operator. > > Note that the code in the block argument to `lines()` does not actually get > run, because `lines()` doesn't call it. `lines()` calls the `.lines` method. > > --- > > A block can be an argument or part of a keyword like `for` > > foo {;} > foo( {;} ) # exactly the same > > for '…' {;} > if '…' {;} > when '…' {;} > whenever '…' {;} > > So when you do > > for lines {;} > > The `lines()` argument list captures the block. > > for lines( {;} ) > > Which leaves nothing for the `for`. > > Since a block CAN be an argument to a function, the block above MUST be an > argument to `lines()`. > > If you don't want the block to be an argument, you have to make sure the > argument list to `lines` ends before the block. > It doesn't matter how it ends, only that it does. > > You could also end the argument list to `lines()` by using a postfix operator. > > sub postfix:< ^_^ > ( +C ) { C } # intentionally has a dumb “name” > > for lines^_^ { .say } > > Since a postfix operator must come after something, it forces the argument > list to end first so it can attach to `lines()`. > > Again, it doesn't matter how the argument list ends, only that it does. > > --- > > > {;}.lines; > No such method 'lines' for invocant of type 'Block'. Did you mean 'line'? > > The above is where that error comes from, because that is all `lines()` does, > is call a method of that name. > > --- > > The parser actually has very simple rules about how it parses your code. > > The biggest problem you have is that you are trying to deduce it yourself and > you keep coming up with wrong assumptions. > (Probably assumptions from other languages.) > > The worst part is we keep trying to tell you this, and trying to correct > those wrong assumptions, but you keep making the same assumptions. > > I don't know of a nicer way to tell you this. > > --- > > I really want you to know the syntax rules, but I don't want to keep trying > to say the same thing over and over again. > > I mean maybe I'm just not that good at explaining it. > I want to be better at that, so if I confuse you, please tell me. So that I > can be better in the future. > > > On Mon, Aug 5, 2019 at 5:22 PM William Michels via perl6-users > <perl6-us...@perl.org> wrote: >> >> Thank you Richard, for taking time to explain this. I've put comments >> below (inline): >> >> On Mon, Aug 5, 2019 at 10:26 AM Richard Hainsworth >> <rnhainswo...@gmail.com> wrote: >> > >> > William, >> > >> > I saw others were replying and between what Brad had said and what I had >> > said, I thought the explanations were pretty clear. >> > >> > So I'll try again. >> > >> > Comments in text below. >> > >> > On 03/08/2019 07:11, William Michels wrote: >> > > Hi Richard, I'm not able to come to the same conclusions. >> > > Specifically, the previous code examples starting with 'for lines()' >> > > always have to have parentheses following 'lines' (as in 'lines() >> > > {...}'), otherwise Perl_6 balks (examples 6 and 7 previously posted). >> > > This is whether 'information is being passed' or not (i.e. empty >> > > parentheses are required): >> > > >> > > #example 6: >> > > mbook:~ homedir$ perl6 -e ' for lines() { say .split(":")[0, 2, 1, >> > > 5].join("\t") };' six_fruits1.txt >> > > apple carrot banana favabean >> > > apricot cabbage basil fennel >> > > acai celery beets figs >> > > >> > > #example 6 no-parens: >> > > mbook:~ homedir$ perl6 -e ' for lines { say .split(":")[0, 2, 1, >> > > 5].join("\t") };' six_fruits1.txt >> > > ===SORRY!=== >> > > Function 'lines' needs parens to avoid gobbling block >> > > at -e:1 >> > > ------> say .split(":")[0, 2, 1, 5].join("\t") }; >> > > Missing block (apparently claimed by 'lines') >> > > at -e:1 >> > > ------> say .split(":")[0, 2, 1, 5].join("\t") }; >> > >> > It seems to me that the error message is quite clear. Perl 6 knows >> > 'lines' can take something following it, and it is expecting to get a >> > list which can be interpreted as lines to act upon. But then 'for' has >> > nothing to work on. Perl6 has figured out that you actually want the >> > block to go with the 'for' and not 'lines', but since there is an >> > ambiguity, Perl 6 errors out, and tells you what the probable mistake is. >> > >> > It has nothing to do with whether 'lines' needs () or not, but to do >> > with writing unambiguous code. Rather than writing 'lines()', which >> > personally I find distasteful, I would write: >> > >> > perl6 -e '.split(":")[0,2,1,5].join("\t").say for lines' six_fruits1.txt >> > >> > 'lines' has no () , in your words 'is bare'. But this code is >> > unambiguous because it is clear that `.split` etc will take the topic >> > (aka $_) from the 'for' and 'lines' takes its data from @_, which is >> > provided from the file. >> > >> > > >> > > #example 7: >> > > mbook:~ homedir$ perl6 -e 'for lines() {.split(":")[0, 2, 1, >> > > 5].join("\t").say};' six_fruits1.txt >> > > apple carrot banana favabean >> > > apricot cabbage basil fennel >> > > acai celery beets figs >> > > >> > > #example 7 no-parens: >> > > mbook:~ homedir$ perl6 -e 'for lines {.split(":")[0, 2, 1, >> > > 5].join("\t").say};' six_fruits1.txt >> > > ===SORRY!=== >> > > Function 'lines' needs parens to avoid gobbling block >> > > at -e:1 >> > > ------> {.split(":")[0, 2, 1, 5].join("\t").say}; >> > > Missing block (apparently claimed by 'lines') >> > > at -e:1 >> > > ------> {.split(":")[0, 2, 1, 5].join("\t").say}; >> > Same explanation as before. There is no difference between `say .split` >> > etc in your example 6, and `.split ... .say` in example 7. So the >> > problem you are running into has nothing to do with chaining .say or >> > using say as a sub. >> > > >> > > mbook:~ homedir$ perl6 --version >> > > This is Rakudo version 2019.07.1 built on MoarVM version 2019.07.1 >> > > implementing Perl 6.d. >> > > mbook:~ homedir$ >> > > >> > > Other Perl_6 users have replied with a general discussion of >> > > differences between using lines() as a method, or in a subroutine. I >> > > still have to review some of those comments. However, as I'm using the >> > > latest Perl_6 version (2019.07.1), I'm fairly confident in the results >> > > above (and below). >> > > >> > > Also, the examples below show that 'for lines[0..2] {...}' works, >> > > despite the previous error message insisting on parentheses ("Function >> > > 'lines' needs parens to avoid gobbling block at -e:1"). Taken >> > > together, the results above and below seem to indicate to me that the >> > > use of a bare 'lines' sub is disallowed, at least in a 'for' loop. >> > >> > Nope. What is disallowed is a bare 'lines' sub in an ambiguous context. >> > The idiom 'for lines { .say }' is ambiguous because >> > >> > the '{ .say }' has to be given to 'lines', but you want it to be given >> > to 'for'. And the reason for that choice of syntax was explained by Brad. >> > >> > This works: >> > >> > perl6 -e 'for ( lines ) { .split(":")[0, 2, 1, 5].join("\t") }' >> > six_fruits1.txt >> > >> > 'lines' is bare, but the brackets disambiguate the block from 'lines' . >> > Personally, I think this is also somewhat ugly. >> > >> > The following 'bare lines with a for' also 'works' in that no errors are >> > generated (Perl 6 does not disallow bare 'lines' with a for), but there >> > is no output so it doesn't give the desired output. >> >> Not working for me: the code doesn't return an error but it doesn't >> return an answer, either: >> >> mbook:~ homedir$ perl6 -e 'for (lines) { .split(":")[0, 2, 1, >> 5].join("\t") }' six_fruits1.txt >> mbook:~ homedir$ >> >> Okay...I see what happened. The ".say" call needs to be added at the end: >> >> mbook:~ homedir$ perl6 -e 'for (lines) { .split(":")[0, 2, 1, >> 5].join("\t").say }' six_fruits1.txt >> apple carrot banana favabean >> apricot cabbage basil fennel >> acai celery beets figs >> mbook:~ homedir$ >> >> > >> > perl6 -e 'for lines {} { .split(":")[0, 2, 1, 5].join("\t") }' >> > six_fruits1.txt >> > >> > Obviously, 'lines' has been given something to operate on, and in this >> > case it is interpreted not as a block, but an empty hash. And since >> > 'lines' had been given an explicit argument, Perl 6 did not know to >> > provide the data from six_fruits1.txt to anything, so the data was ignored. >> >> Okay, same result as earlier: I need to add ".say" at the end to get >> any output. I see that a separate "{}" returns nothing, but if I put >> the "{}" adjacent to "lines" as in "lines{}" all of a sudden it works >> and gives the correct answer. Not only does "lines{}" work, but >> "lines()" and "lines[]" works. What doesn't seem to work is a bare >> "lines" as noted previously: >> >> mbook:~ homedir$ perl6 -e 'for lines {} { .split(":")[0, 2, 1, >> 5].join("\t") }' six_fruits1.txt >> mbook:~ homedir$ perl6 -e 'for lines {} { .split(":")[0, 2, 1, >> 5].join("\t").say }' six_fruits1.txt >> mbook:~ homedir$ perl6 -e 'for lines{} { .split(":")[0, 2, 1, >> 5].join("\t").say }' six_fruits1.txt >> apple carrot banana favabean >> apricot cabbage basil fennel >> acai celery beets figs >> mbook:~ homedir$ perl6 -e 'for lines() { .split(":")[0, 2, 1, >> 5].join("\t").say }' six_fruits1.txt >> apple carrot banana favabean >> apricot cabbage basil fennel >> acai celery beets figs >> mbook:~ homedir$ perl6 -e 'for lines[] { .split(":")[0, 2, 1, >> 5].join("\t").say }' six_fruits1.txt >> apple carrot banana favabean >> apricot cabbage basil fennel >> acai celery beets figs >> mbook:~ homedir$ perl6 -e 'for lines { .split(":")[0, 2, 1, >> 5].join("\t").say }' six_fruits1.txt >> ===SORRY!=== >> Function 'lines' needs parens to avoid gobbling block >> at -e:1 >> ------> .split(":")[0, 2, 1, 5].join("\t").say }<EOL> >> Missing block (apparently claimed by 'lines') >> at -e:1 >> ------> .split(":")[0, 2, 1, 5].join("\t").say }<EOL> >> >> >> > >> > Almost the same thing, note the space between 'lines' and '()': >> > >> > perl6 -e 'for lines () { .split(":")[0, 2, 1, 5].join("\t") }' >> > six_fruits1.txt >> > >> > Here, 'lines' is given an empty list, viz. ' ()', the preceding space >> > telling Perl 6 that '()' is a list, not a signature >> > >> > However, "bare lines" is not "disallowed" for a 'for'. >> > >> > Hope this helps. >> >> (I said bare 'lines', not 'bare lines'). But I think I see what you're >> saying. First I add the ".say" method below (otherwise i get no >> result), then i eliminate everything but { .say} inside the curly >> braces. This actually lets me feed an object (for lack of a better >> word) into the block: >> >> mbook:~ homedir$ perl6 -e 'for lines () { .split(":")[0, 2, 1, >> 5].join("\t") }' six_fruits1.txt >> mbook:~ homedir$ perl6 -e 'for lines() { .split(":")[0, 2, 1, >> 5].join("\t") }' six_fruits1.txt >> mbook:~ homedir$ perl6 -e 'for lines () { .split(":")[0, 2, 1, >> 5].join("\t").say }' six_fruits1.txt >> mbook:~ homedir$ perl6 -e 'for lines() { .split(":")[0, 2, 1, >> 5].join("\t").say }' six_fruits1.txt >> apple carrot banana favabean >> apricot cabbage basil fennel >> acai celery beets figs >> mbook:~ homedir$ perl6 -e 'for (lines) { .split(":")[0, 2, 1, >> 5].join("\t").say }' six_fruits1.txt >> apple carrot banana favabean >> apricot cabbage basil fennel >> acai celery beets figs >> mbook:~ homedir$ perl6 -e 'for lines () { .split(":")[0, 2, 1, >> 5].join("\t").say }' >> mbook:~ homedir$ perl6 -e 'for lines ("a\nb\n") { .split(":")[0, 2, 1, >> 5].join("\t").say }' >> Use of Nil in string context >> in block at -e line 1 >> Use of Nil in string context >> in block at -e line 1 >> Use of Nil in string context >> in block at -e line 1 >> a >> Use of Nil in string context >> in block at -e line 1 >> Use of Nil in string context >> in block at -e line 1 >> Use of Nil in string context >> in block at -e line 1 >> b >> mbook:~ homedir$ perl6 -e 'for lines ("a\nb\n") { .say }' >> a >> b >> mbook:~ homedir$ >> >> Okay. How to express this in simple English? Writing a one-liner "for" >> loop for use on a shell command line, you can feed lines into a block >> using 'lines()' and adding the target file at the end. Or you can >> write "for lines ("line_1\nline_2\n") and then the functions you want >> to perform inside the block. >> >> Correct? Best Regards, Bill. >> >> >> >> > >> > >> > > --Best Regards, Bill. >> > > >> > > #example 10: >> > > mbook:~ homedir$ perl6 -e 'for lines { say .split(":")[0, 2, 1, >> > > 5].join("\t") };' six_fruits1.txt >> > > ===SORRY!=== >> > > Function 'lines' needs parens to avoid gobbling block >> > > at -e:1 >> > > ------> say .split(":")[0, 2, 1, 5].join("\t") }; >> > > Missing block (apparently claimed by 'lines') >> > > at -e:1 >> > > ------> say .split(":")[0, 2, 1, 5].join("\t") }; >> > > >> > > #example 11: >> > > mbook:~ homedir$ perl6 -e 'for lines() { say .split(":")[0, 2, 1, >> > > 5].join("\t") };' six_fruits1.txt >> > > apple carrot banana favabean >> > > apricot cabbage basil fennel >> > > acai celery beets figs >> > > >> > > #example 12: >> > > mbook:~ homedir$ perl6 -e 'for lines[0..2] { say .split(":")[0, 2, 1, >> > > 5].join("\t") };' six_fruits1.txt >> > > apple carrot banana favabean >> > > apricot cabbage basil fennel >> > > acai celery beets figs >> > > >> > > >> > > On Fri, Aug 2, 2019 at 1:20 AM Richard Hainsworth >> > > >> > > <rnhainswo...@gmail.com> wrote: >> > >> Not quite sure what sort of "rule" you want. >> > >> >> > >> You used () and [] which do different things and the results were >> > >> exactly what I would expect. They are covered in the documentation. >> > >> Basically, () without a space, eg xxxx() not xxxx (), is used to pass >> > >> information to the sub or method xxxx. >> > >> If no information is being passed, then no need to use (). The way xxxx >> > >> responds to no data provided depends on the way xxxx is written. The >> > >> programmer could provide default values for the arguments it expects. >> > >> Perl6 also makes the value of the default variable, eg $_, to xxxx. >> > >> If you put a space between xxxx (), then () is interpreted as an empty >> > >> list and provide to xxxx as a single piece of information. >> > >> [] Are used to dereference a list (sequence or array, they are all >> > >> slightly different). >> > >> >> > >> I'll comment more below. Sometimes I think through the process using >> > >> slightly different and less exact words. My comments are illustrative. >> > >> >> > >> On Fri, 2 Aug 2019, 04:50 William Michels, <w...@caa.columbia.edu> >> > >> wrote: >> > >>> Hi Richard, I'm trying to figure out when the parentheses in 'lines()' >> > >>> can be dropped, and 'lines' used instead. Any pointers? I have about >> > >>> nine or so working examples below, but formulating a clear >> > >>> rule-of-thumb is proving elusive. Any help appreciated, --Best, Bill. >> > >>> >> > >>> # test file: six_fruits1.txt >> > >>> mbook:~ homedir$ cat six_fruits1.txt >> > >>> apple:banana:carrot:dragonfruit:eggplant:favabean >> > >>> apricot:basil:cabbage:dill:escarole:fennel >> > >>> acai:beets:celery:daikon:endive:figs >> > >>> >> > >>> mbook:~ homedir$ perl6 -e '.say for lines()' six_fruits1.txt >> > >>> apple:banana:carrot:dragonfruit:eggplant:favabean >> > >>> apricot:basil:cabbage:dill:escarole:fennel >> > >>> acai:beets:celery:daikon:endive:figs >> > >> Here 'lines ()' is the same as 'lines'. >> > >> The program in the string after -e is provided with the data inside the >> > >> file. >> > >>> >> > >>> mbook:~ homedir$ perl6 -e '.say for lines' six_fruits1.txt >> > >>> apple:banana:carrot:dragonfruit:eggplant:favabean >> > >>> apricot:basil:cabbage:dill:escarole:fennel >> > >>> acai:beets:celery:daikon:endive:figs >> > >> The top two are equivalent >> > >>> >> > >>> mbook:~ homedir$ perl6 -e '.say for lines("a\nb\n")' six_fruits1.txt >> > >>> a >> > >>> b >> > >> Here you provided data to 'lines' which it was able to interpret as a >> > >> set of lines. So it printed them. The data in six_fruits is ignored >> > >> because you provided the data explicitly. >> > >>> >> > >>> mbook:~ homedir$ perl6 -e '.say for lines[0]' six_fruits1.txt >> > >>> apple:banana:carrot:dragonfruit:eggplant:favabean >> > >> Six_fruits has 3 lines. Lines has processed the data. But you wrote >> > >> '[0]' which extracted the first line, and that was processed by the >> > >> 'for' loop. In other words the 'for' was only given one piece of >> > >> information to process. >> > >>> >> > >>> mbook:~ homedir$ perl6 -e '.say for lines[0..1]' six_fruits1.txt >> > >>> apple:banana:carrot:dragonfruit:eggplant:favabean >> > >>> apricot:basil:cabbage:dill:escarole:fennel >> > >> The '[0..1]' extracts the first three pieces of data from 'lines' and >> > >> they are processed by the 'for' >> > >>> >> > >>> mbook:~ homedir$ perl6 -e ' for lines() { say .split(":")[0, 2, 1, >> > >>> 5].join("\t") };' six_fruits1.txt >> > >>> apple carrot banana favabean >> > >>> apricot cabbage basil fennel >> > >>> acai celery beets figs >> > >> Could be just 'lines', which provides a list of the lines in the file >> > >> to the 'for' >> > >> Inside the 'for' the data is in the topic or default variable. You >> > >> could access it as $_ but '.split' accesses it automatically. Split >> > >> generates another list. '[0,2,1,5]' extracts the relevant elements of >> > >> the list and generates another list which is passed to the'join'. The >> > >> output from join is passed to 'say' which is written in sub form. Sub >> > >> form means you write the name of the sub first, then you write where >> > >> the data is coming from. >> > >> >> > >>> mbook:~ homedir$ perl6 -e ' for lines() {.split(":")[0, 2, 1, >> > >>> 5].join("\t").say};' six_fruits1.txt >> > >>> apple carrot banana favabean >> > >>> apricot cabbage basil fennel >> > >>> acai celery beets figs >> > >> Exactly the same for perl6 as before except that 'say' is written in >> > >> sub form above and in method form here. Method form means you can >> > >> append the 'say' to a chain of processing units. >> > >>> >> > >>> mbook:~ homedir$ perl6 -e 'for "six_fruits1.txt".IO.lines() >> > >>> {.split(/\:/)[0, 2, 1, 5].join("\t").say};' >> > >>> apple carrot banana favabean >> > >>> apricot cabbage basil fennel >> > >>> acai celery beets figs >> > >> Here just accessing the data in the file explicitly in perl6. >> > >>> >> > >>> mbook:~ homedir$ perl6 -e 'for "six_fruits1.txt".IO.lines >> > >>> {.split(/\:/)[0, 2, 1, 5].join("\t").say};' >> > >>> apple carrot banana favabean >> > >>> apricot cabbage basil fennel >> > >>> acai celery beets figs >> > >> Same as above. No () on lines >> > >>> >> > >>> >> > >>> >> > >>> >> > >>> On Mon, Jul 29, 2019 at 1:07 AM Richard Hainsworth >> > >>> <rnhainswo...@gmail.com> wrote: >> > >>>> Also no need for all the brackets >> > >>>> >> > >>>> .say for lines; >> > >>>> >> > >>>> This is quite idiomatic Perl 6 and not golfing >> > >>>> >> > >>>> On Mon, 29 Jul 2019, 07:13 Joseph Brenner, <doom...@gmail.com> wrote: >> > >>>>>> Hmmm. I would expect that to be in the Perl 5 to Perl 6 Migration >> > >>>>>> Guides, but I do not see it there. >> > >>>>> Exactly, I was just looking there, and I ended up playing around with >> > >>>>> the method form of lines, and didn't think to try the function >> > >>>>> form of it. >> > >>>>> >> > >>>>> To summarize, if the goal is to write a "simple_echo" script that >> > >>>>> can work with a file name or with lines on standard input: >> > >>>>> >> > >>>>> simple_echo lines.txt >> > >>>>> cat lines.txt | simple_echo >> > >>>>> >> > >>>>> The perl5 version would probably be: >> > >>>>> >> > >>>>> #!/usr/bin/env perl >> > >>>>> while(<>){ >> > >>>>> print; >> > >>>>> } >> > >>>>> >> > >>>>> The perl6 version would be something like: >> > >>>>> >> > >>>>> #!/usr/bin/env perl6 >> > >>>>> use v6; >> > >>>>> for lines() { >> > >>>>> say $_; >> > >>>>> } >> > >>>>> >> > >>>>> >> > >>>>> The kind of thing I was playing with was: >> > >>>>> >> > >>>>> #!/usr/bin/env perl6 >> > >>>>> use v6; >> > >>>>> my @lines = $*ARGFILES.IO.lines; >> > >>>>> say @lines; >> > >>>>> >> > >>>>> That works for lines from a file, but not from standard input, and >> > >>>>> the >> > >>>>> error message isn't tremendously helpful: >> > >>>>> >> > >>>>> No such method 'lines' for invocant of type 'IO::Special' >> > >>>>> >> > >>>>> >> > >>>>> >> > >>>>> >> > >>>>> On 7/28/19, Bruce Gray <robertbrucegr...@gmail.com> wrote: >> > >>>>>> >> > >>>>>>> On Jul 28, 2019, at 6:20 PM, Joseph Brenner <doom...@gmail.com> >> > >>>>>>> wrote: >> > >>>>>>> >> > >>>>>>> I was just wondering if there's some direct analog in perl6 to the >> > >>>>>>> perl5 construct: >> > >>>>>>> >> > >>>>>>> while(<>){ ... } >> > >>>>>>> >> > >>>>>>> If I'm planning on passing a filename on the command-line, I can >> > >>>>>>> just >> > >>>>>>> get it out of $*ARGFILES easily enough, but what if I also wanted >> > >>>>>>> it >> > >>>>>>> to work on lines passed in via standard input? >> > >>>>>> >> > >>>>>> `lines` , as a sub instead of a method, and no arguments. >> > >>>>>> >> > >>>>>> See: https://docs.perl6.org/routine/lines#(Cool)_routine_lines >> > >>>>>> Without any arguments, sub lines operates on $*ARGFILES, >> > >>>>>> which defaults to >> > >>>>>> $*IN in the absence of any filenames. >> > >>>>>> >> > >>>>>> For example: >> > >>>>>> perl6 -e 'say .join("\t") for lines().rotor(4);' >> > >>>>>> path/to/file.txt >> > >>>>>> >> > >>>>>> Hmmm. I would expect that to be in the Perl 5 to Perl 6 Migration >> > >>>>>> Guides, >> > >>>>>> but I do not see it there. >> > >>>>>> >> > >>>>>> — >> > >>>>>> Hope this helps, >> > >>>>>> Bruce Gray (Util of PerlMonks) >> > >>>>>> >> > >>>>>>