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) > >> > > >> > >