Author: wayland Date: 2009-02-24 06:17:29 +0100 (Tue, 24 Feb 2009) New Revision: 25519
Modified: docs/Perl6/Spec/S28-special-variables.pod Log: Lots of general reoganisation. Still needs lots more work, and I will continue when I get the chance (probably tomorrow). Hope I haven't reintroduced any old artifacts again :). Modified: docs/Perl6/Spec/S28-special-variables.pod =================================================================== --- docs/Perl6/Spec/S28-special-variables.pod 2009-02-24 05:13:28 UTC (rev 25518) +++ docs/Perl6/Spec/S28-special-variables.pod 2009-02-24 05:17:29 UTC (rev 25519) @@ -131,50 +131,6 @@ =over 8 -=item $0,$1,$2... - -Objects containing information on any subpatterns -from the corresponding set of capturing -parentheses from the last pattern match, not counting patterns -matched in nested blocks that have been exited already. -These variables are all read-only and dynamically scoped to the -current BLOCK. Shortcut to same info in $/ with data structures containing -such things as .start and .end (Unicode level independent). - -=over 4 - -=item p5: - -$1,$2,$3... but now as objects, and base zero instead of one. - -=back - -=back - -=over 8 - -=item $0 - -$0 (dollar-zero) is the string matched by the last successful -pattern match (not counting any matches hidden within a BLOCK -or eval() enclosed by the current BLOCK). -This variable is read-only and dynamically scoped to the current BLOCK. -What would be returned by $1 if you had -put parens around the entire match. $0 is not bound until -the match succeeds. - -=over 4 - -=item p5: - -$&, $MATCH - -=back - -=back - -=over 8 - =item $*MOST_RECENT_CAPTURED_MATCH =item $/[-1] =item $/[-$n] @@ -192,99 +148,6 @@ =back -=over 8 - -=item $. - -=item $IN_FH.input_line_number ...or some such - -May-be. Current line number for the filehandle. -Each filehandle in Perl counts the number of lines -that have been read from it. -(Depending on the value of $IN_FH.input_rec_separator, -Perl's idea of what constitutes a line may not match yours.) -When a line is read from a filehandle, -or when tell() or seek() is called on it, -$IN_FH.input_rec_separator becomes an alias to the -line counter for that filehandle. - -=over 4 - -=item p5: - -$. $NR $INPUT_LINE_NUMBER HANDLE->input_line_number(EXPR) -But now with cleaned-up localization usage. - -=back - -=back - -=over 8 - -=item $IN_FH.input_rec_separator ...or some such - -The input record separator, newline by default. -This influences Perl's idea of what a ``line'' is. -Works like awk's RS variable, including treating empty lines -as a terminator if set to the null string. -(An empty line cannot contain any spaces or tabs.) -You may set it to a multi-character string to match a multi-character -terminator, or to undef to read through the end of file. -Setting it to "\n\n" means something slightly different -than setting to "", if the file contains consecutive empty lines. -Setting to "" will treat two or more consecutive empty lines -as a single empty line. Setting to "\n\n" will blindly assume -that the next input character belongs to the next paragraph, -even if it's a newline. -(Mnemonic: / delimits line boundaries when quoting poetry.) - -Remember: the value of $/ is a string, not a regex. -awk has to be better for something. :-) - -=over 4 - -=item p5: - -$/ $RS $INPUT_RECORD_SEPARATOR -IO::Handle->input_record_separator(EXPR) - -=back - -=back - -=over 8 - -=item $OUT_FH.autoflush ...or some such - -If set to nonzero, forces a flush right away and after every write -or print on the currently selected output channel. -Default is 0 (regardless of whether the channel is really buffered -by the system or not; -$OUT_FH.autoflush tells you only whether you've asked Perl -explicitly to flush after each write). -$*OUT will typically be line buffered if output is to the -terminal and block buffered otherwise. -Setting this variable is useful primarily when you are -outputting to a pipe or socket, -such as when you are running a Perl program under rsh -and want to see the output as it's happening. -This has no effect on input buffering. -(Mnemonic: when you want your pipes to be piping hot.) - -=over 4 - -=item p5: - -$| $OUTPUT_AUTOFLUSH HANDLE->autoflush(EXPR) - -=back - -=back - - -. . . More to come here . . . - - =head1 PERL 6 / PERL 5 COMPARISON =over 4 @@ -309,90 +172,56 @@ =back - Perl 5 Perl 6 Comment - ----------- ----------- ----------------------- - STDIN $*IN See S16 + Perl 5 Perl 6 Comment + ----------- ----------- ----------------------- + STDIN $*STDIN See S16; you probably want $*IN + STDOUT $*STDOUT See S16; you probably want $*OUT + STDERR $*STDERR See S16; you probably want $*ERR + $_ $_ More lexically aware + $_[1],$_[2].. $^a,$^b.. + $a,$b - Just params to anonymous block + - $/ Object with results of last regex match + $1,$2,$3... $1,$2,$3... + $&, $MATCH $<> + $`, $PREMATCH $<pre> + $', $POSTMATCH $<post> + $+ - But info can now be retrieved from $/ + $^N $*MOST_RECENT_CAPTURED_MATCH ...or some such. + or $/[-$n] ...or omit + @- $1.start, etc + @+ $1.end, etc. + $* - + $# - + $. $*IN.input_record_number() + $/ $*IN.input_record_separator() + $| $*OUT.autoflush() + $, $*OUT.output_field_separator() + $\ $*OUT.output_record_separator() + $$, $PID $*PID + $<, $UID $*UID Real UID (User ID) + $(, $GID $*GID Real GID (Group ID) + $>, $EUID $*EUID Effective UID + $), $EGID $*EGID Effective GID + $0, $PROGRAM_NAME $*PROGRAM_NAME + $^C, $COMPILING $*COMPILING + $^D, $DEBUGGING $*DEBUGGING + $^F, $SYS_FD_MAX $*SYS_FD_MAX ...or some such + $^I, $INPLACE_EDIT $*INPLACE_EDIT ...or some such + $^M $*EMERGENCY_MEMORY ...or some such (or omit) + $^O, $OSNAME $*OSNAME ...or some such + $^P, $PERLDB $*PERLDB ...or some such + $^R $*LAST_REGEXP_CODE_RESULT ...or some such. Or omit. + $^T, $BASETIME $*BASETIME A Temporal::Instant object + ${^WARNING_BITS} $?WARNINGS + $^X $*EXECUTABLE_NAME ...or some such + $EXECUTABLE_NAME - STDOUT $*OUT See S16 - - STDERR $*ERR See S16 - - $_ $_ More lexically aware - - $_[1],$_[2].. $^a,$^b.. - - $a,$b - Just params to anonymous block - - - $/ Object with results of last regex match - - $1,$2,$3... $1,$2,$3... - - $& $<> - - $` $<pre> - - $' $<post> - - $+ - But info can now be retrieved from $/ - - $^N $*MOST_RECENT_CAPTURED_MATCH ...or some such. - or $/[-1] ...or omit - or $/[-$n] - - @+ $1.end, etc. - - $* - - - $. $IN_FH.input_line_number ...or some such - - $/ $IN_FH.input_rec_separator ...or some such - ******* XXX the columns seem to have switched! ********* - $OUT_FH.autoflush ...or some such - $| $OUTPUT_AUTOFLUSH - HANDLE->autoflush(EXPR) - - $OUT_FH.output_field_separator ...or some such - $, $OFS $OUTPUT_FIELD_SEPARATOR - IO::Handle->output_field_separator - - $OUT_FH.output_record_separator ...or some such - $\ $ORS $OUTPUT_RECORD_SEPARATOR - IO::Handle->output_record_separator - - $" $LIST_SEPARATOR - $; $SUBSEP $SUBSCRIPT_SEPARATOR - - $# Output format for printed numbers. - - - $% $FORMAT_PAGE_NUMBER - - HANDLE->format_page_number(EXPR) - - - $= $FORMAT_LINES_PER_PAGE - - HANDLE->format_lines_per_page(EXPR) - - - $- $FORMAT_LINES_LEFT - - HANDLE->format_lines_left(EXPR) - - $1.start, etc. @- @LAST_MATCH_START - - - $~ $FORMAT_NAME - - HANDLE->format_name(EXPR) - - - $^ $FORMAT_TOP_NAME - - HANDLE->format_top_name(EXPR) - - - $: $FORMAT_LINE_BREAK_CHARACTERS - - IO::Handle->format_line_break_characters - - - $^L $FORMAT_FORMFEED - - IO::Handle->format_formfeed - - - $^A $ACCUMULATOR - - ? ${^ENCODING} $! Universal error object with as much info as @@ -407,20 +236,6 @@ - %! - $*PID $$ $PID $PROCESS_ID - - $*UID ...or some such - $< $UID $REAL_USER_ID - $*EUID ...or some such - $> $EUID $EFFECTIVE_USER_ID - $*GID ...or some such - $( $GID $REAL_GROUP_ID - $*EGID ...or some such - $) $EGID $EFFECTIVE_GROUP_ID - - $*PROGRAM_NAME ...or some such - $0 $PROGRAM_NAME - - $[ Index of the first element in an array, and of the first character in a substring. @@ -429,38 +244,11 @@ - $] version + patchlevel / 1000 of Perl interpreter Replacement for the above two is unclear. - $*COMPILING ...or some such - $^C $COMPILING - - $*DEBUGGING ...or some such - $^D $DEBUGGING - - $*SYS_FD_MAX ...or some such - $^F $SYSTEM_FD_MAX - - $^H - %^H - $*INPLACE_EDIT ...or some such - $^I $INPLACE_EDIT - - $*EMERGENCY_MEMORY ...or some such (or omit) - $^M - - $*OSNAME ...or some such - $^O $OSNAME - - ${^OPEN} - $*PERLDB ...or some such - $^P $PERLDB - - $*LAST_REGEXP_CODE_RESULT ...or some such. Or omit. - $^R $LAST_REGEXP_CODE_RESULT - - $*BASETIME ...or some such - $^T $BASETIME - ? ${^TAINT} ? ${^UNICODE} @@ -469,11 +257,6 @@ of) warnings within both lexical and dynamic scopes. - $?WARNINGS ${^WARNING_BITS} - - $*EXECUTABLE_NAME ...or some such - $^X $EXECUTABLE_NAME - ? $ARGV $*ARGS ARGV Note the P6 idiom: @@ -669,3 +452,442 @@ =cut +=encoding utf8 + +=head1 TITLE + +Synopsis 2: Bits and Pieces + +S02 + +=head1 AUTHOR + +Larry Wall <la...@wall.org> + +=head1 VERSION + + Maintainer: Larry Wall <la...@wall.org> + Date: 10 Aug 2004 + Last Modified: 20 Feb 2009 + Number: 2 + Version: 153 + +=item * + +Many of the special variables of PerlĀ 5 are going away. Those that +apply to some object such as a filehandle will instead be attributes +of the appropriate object. Those that are truly global will have +global alphabetic names, such as C<$*PID> or C<@*ARGS>. + +=item * + +Any remaining special variables will be lexically scoped. +This includes C<$_> and C<@_>, as well as the new C<$/>, which +is the return value of the last regex match. C<$0>, C<$1>, C<$2>, etc., +are aliases into the C<$/> object. + +=item * + +The following pseudo-package names are reserved at the front of a name: + + MY # Symbols in the current lexical scope (aka $?SCOPE) + OUR # Symbols in the current package (aka $?PACKAGE) + +=item * + +When "strict" is in effect (which is the default except for one-liners), +non-qualified variables (such as C<$x> and C<@y>) are only looked up from +lexical scopes, but never from package scopes. + +To bind package variables into a lexical scope, simply say C<our ($x, @y)>. +To bind global variables into a lexical scope, predeclare them with C<use>: + + use GLOBAL <$IN $OUT>; + +Or just refer to them as C<$*IN> and C<$*OUT>. + +=item * + +The C<CALLER> package refers to the lexical scope of the (dynamically +scoped) caller. The caller's lexical scope is allowed to hide any +user-defined variable from you. In fact, that's the default, and a +lexical variable must have the trait "C<is context>" to be +visible via C<CALLER>. (C<$_>, C<$!> and C<$/> are always +contextual.) If the variable is not visible in the caller, it returns +failure. Variables whose names are visible at the point of the call but that +come from outside that lexical scope are controlled by the scope +in which they were originally declared as contextual. +Hence the visibility of C<< CALLER::<$*foo> >> is determined where +C<$*foo> is actually declared, not by the caller's scope (unless that's where +it happens to be declared). Likewise C<< CALLER::CALLER::<$x> >> +depends only on the declaration of C<$x> visible in your caller's caller. + +Any lexical declared with the C<is context> trait is by default +considered readonly outside the current lexical scope. You may +add a trait argument of C<< <rw> >> to allow called routines to +modify your value. C<$_>, C<$!>, and C<$/> are C<< context<rw> >> +by default. In any event, the declaring scope can always access the +variable as if it were an ordinary variable; the restriction on writing +applies only to access via the C<*> twigil. + +=item * + +The C<CONTEXT> pseudo-package is just like C<CALLER> except that +it starts in the current dynamic scope and from there +scans outward through all dynamic scopes until it finds a +contextual variable of that name in that context's lexical scope. +(Use of C<$*FOO> is equivalent to C<< CONTEXT::<$FOO> >> or C<< $CONTEXT::FOO >>.) +If after scanning all the lexical scopes of each dynamic scope, +there is no variable of that name, it looks in the C<GLOBAL> package followed +by the C<PROCESS> package. +If there is no such package variable, +it then looks in C<CONTEXT::<%ENV> for the identifier of the variable, +which, if not overridden in a dynamic scope, finds C<< PROCESS::<%ENV> >>, +that is, in the environment variables passed to program. If the +value is not found there, it returns failure. If the variable is +of the form C<$*FOO>, the complete environment value is returned. If it +is of the form C<@*FOO> the string will be split either on colons or +semicolons as appropriate to the current operating system. Usage of +the C<%*FOO> form is currently undefined. + +Unlike C<CALLER>, C<CONTEXT> will see a contextual variable that is declared in +the current scope, however it will not be writeable via C<CONTEXT> unless +declared "C<< is context<rw> >>", even if the variable itself is +modifiable in that scope. (If it is, you should just use the bare +variable itself to modify it.) Note that C<$*_> will always see +the C<$_> in the current scope, not the caller's scope. You may +use C<< CALLER::<$*foo> >> to bypass a contextual definition of C<$foo> +in your current context, such as to initialize it with the outer +contextual value: + + my $foo is context = CALLER::<$*foo>; + +The C<temp> maybe used on a contextual variable to perform a similar operation: + + temp $*foo; + +The main difference is that by default it initializes the new +C<$*foo> with its previous value, rather than the caller's value. +The temporized contextual variable takes its read/write policy from +the previous C<$*foo> container. + +The C<CONTEXT> package is primarily for internal overriding of contextual +information, modelled on how environmental variables work among +processes. Despite the fact that the C<CONTEXT> package reflects the +current process's environment variables individually where those are not +hidden by lower-level declarations, the actual set of environment variables +that will be passed to subprocesses is taken from the C<%*ENV> variable. +Hence you must override that variable itself to influence what is +passed to subprocesses. That is, + + temp $*LANG = "ja_JP.utf8"; # WRONG + run "greet"; + +does not set the LANG environment variable for the greet program. Instead +you should make a private copy of the environment and modify that: + + temp %*ENV; + %*ENV<LANG> = "ja_JP.utf8"; # ok + run "greet"; + +=item * + +There is no longer any special package hash such as C<%Foo::>. Just +subscript the package object itself as a hash object, the key of which +is the variable name, including any sigil. The package object can +be derived from a type name by use of the C<::> postfix: + + MyType::<$foo> + +(Directly subscripting the type with either square brackets or curlies +is reserved for various generic type-theoretic operations. In most other +matters type names and package names are interchangeable.) + +Typeglobs are gone. Use binding (C<:=> or C<::=>) to do aliasing. +Individual variable objects are still accessible through the +hash representing each symbol table, but you have to include the +sigil in the variable name now: C<MyPackage::{'$foo'}> or the +equivalent C<< MyPackage::<$foo> >>. + +=item * + +Truly global variables live in the C<*> package: C<$*UID>, C<%*ENV>. +(The C<*> may be omitted if you import the name from the C<GLOBAL> +package.) C<$*foo> is short for C<$*::foo>, suggesting that the +variable is "wild carded" into every package. + +=item * + +For an ordinary Perl program running by itself, the C<GLOBAL> and +C<PROCESS> namespaces are considered synonymous. However, in certain +situations (such as shared hosting under a webserver), the actual +process may contain multiple virtual processes, each running its own +"main" code. In this case, the C<GLOBAL> namespace holds variables +that properly belong to the individual virtual process, while the +C<PROCESS> namespace holds variables that properly belong to the actual +process as a whole. From the viewpoint of the C<GLOBAL> namespace +there is little difference, since process variables that normally +appear in C<GLOBAL> are automatically imported from C<PROCESS>. +However, the process as a whole may place restrictions on the +mutability of process variables as seen by the individual subprocesses. +Also, individual subprocesses may not create new process variables. +If the process wishes to grant subprocesses the ability to communicate +via the C<PROCESS> namespace, it must supply a writeable variable +to all the subprocesses granted that privilege. + +When these namespaces are so distinguished, the C<*> shortcut always refers +to C<GLOBAL>. There is no twigil shortcut for C<PROCESS>. + +=item * + +The magic command-line input handle is C<$*ARGFILES>. +The arguments themselves come in C<@*ARGS>. See also "Declaring a MAIN +subroutine" in S06. + +=item * + +Magical file-scoped values live in variables with a C<=> secondary +sigil. C<$=DATA> is the name of your C<DATA> filehandle, for instance. +All pod structures are available through C<%=POD> (or some such). +As with C<*>, the C<=> may also be used as a package name: C<$=::DATA>. + +=item * + +Magical lexically scoped values live in variables with a C<?> secondary +sigil. These are all values that are known to the compiler, and may +in fact be dynamically scoped within the compiler itself, and only +appear to be lexically scoped because dynamic scopes of the compiler +resolve to lexical scopes of the program. All C<$?> variables are considered +constants, and may not be modified after being compiled in. The user +is also allowed to define or (redefine) such constants: + + constant $?TABSTOP = 4; # assume heredoc tabs mean 4 spaces + +(Note that the constant declarator always evaluates its initialization +expression at compile time.) + +C<$?FILE> and C<$?LINE> are your current file and line number, for +instance. C<?> is not a shortcut for a package name like C<*> is. +Instead of C<$?OUTER::SUB> you probably want to write C<< OUTER::<$?SUB> >>. +Within code that is being run during the compile, such as C<BEGIN> blocks, or +macro bodies, or constant initializers, the compiler variables must be referred +to as (for instance) C<< COMPILING::<$?LINE> >> if the bare C<$?LINE> would +be taken to be the value during the compilation of the currently running +code rather than the eventual code of the user's compilation unit. For +instance, within a macro body C<$?LINE> is the line within the macro +body, but C<< COMPILING::<$?LINE> >> is the line where the macro was invoked. +See below for more about the C<COMPILING> pseudo package. + +Here are some possibilities: + + $?FILE Which file am I in? + $?LINE Which line am I at? + $?PARSER Which Perl grammar was used to parse this statement? + $?LANG Which Perl parser should embedded closures parse with? + &?ROUTINE Which routine am I in? + @?ROUTINE Which nested routines am I in? + &?BLOCK Which block am I in? + @?BLOCK Which nested blocks am I in? + $?LABEL Which innermost block label am I in? + @?LABEL Which nested block labels am I in? + +All the nested C<@?> variables are ordered from the innermost to the +outermost, so C<@?BLOCK[0]> is always the same as C<&?BLOCK>. + +The following return objects that contain all pertinent info: + + $?OS Which operating system am I compiled for? + $?DISTRO Which OS distribution am I compiling under + $?VM Which virtual machine am I compiling under + $?XVM Which virtual machine am I cross-compiling for + $?PERL Which Perl am I compiled for? + $?SCOPE Which lexical scope am I in? + $?PACKAGE Which package am I in? + @?PACKAGE Which nested packages am I in? + $?MODULE Which module am I in? + @?MODULE Which nested modules am I in? + $?CLASS Which class am I in? (as variable) + @?CLASS Which nested classes am I in? + $?ROLE Which role am I in? (as variable) + @?ROLE Which nested roles am I in? + $?GRAMMAR Which grammar am I in? + @?GRAMMAR Which nested grammars am I in? + +It is relatively easy to smartmatch these constant objects +against pairs to check various attributes such as name, +version, or authority: + + given $?VM { + when :name<Parrot> :ver(v2) { ... } + when :name<CLOS> { ... } + when :name<SpiderMonkey> { ... } + when :name<JVM> :ver(v6.*) { ... } + } + +Matches of constant pairs on constant objects may all be resolved at +compile time, so dead code can be eliminated by the optimizer. + +Note that some of these things have parallels in the C<*> space at run time: + + $*OS Which OS I'm running under + $*DISTRO Which OS distribution I'm running under + $*VM Which VM I'm running under + $*PERL Which Perl I'm running under + +You should not assume that these will have the same value as their +compile-time cousins. + +=item * + +While C<$?> variables are constant to the run time, the compiler +has to have a way of changing these values at compile time without +getting confused about its own C<$?> variables (which were frozen in +when the compile-time code was itself compiled). The compiler can +talk about these compiler-dynamic values using the C<COMPILING> pseudopackage. + +References to C<COMPILING> variables are automatically hoisted into the +context currently being compiled. Setting or temporizing a C<COMPILING> +variable sets or temporizes the incipient C<$?> variable in the +surrounding lexical context that is being compiled. If nothing in +the context is being compiled, an exception is thrown. + + $?FOO // say "undefined"; # probably says undefined + BEGIN { COMPILING::<$?FOO> = 42 } + say $?FOO; # prints 42 + { + say $?FOO; # prints 42 + BEGIN { temp COMPILING::<$?FOO> = 43 } # temporizes to *compiling* block + say $?FOO; # prints 43 + BEGIN { COMPILING::<$?FOO> = 44 } + say $?FOO; # prints 44 + BEGIN { say COMPILING::<$?FOO> } # prints 44, but $?FOO probably undefined + } + say $?FOO; # prints 42 (left scope of temp above) + $?FOO = 45; # always an error + COMPILING::<$?FOO> = 45; # an error unless we are compiling something + +Note that C<< CALLER::<$?FOO> >> might discover the same variable +as C<COMPILING::<$?FOO>>, but only if the compiling context is the +immediate caller. Likewise C<< OUTER::<$?FOO> >> might or might not +get you to the right place. In the abstract, C<COMPILING::<$?FOO>> +goes outwards dynamically until it finds a compiling scope, and so is +guaranteed to find the "right" C<$?FOO>. (In practice, the compiler +hopefully keeps track of its current compiling scope anyway, so no +scan is needed.) + +Perceptive readers will note that this subsumes various "compiler hints" +proposals. Crazy readers will wonder whether this means you could +set an initial value for other lexicals in the compiling scope. The +answer is yes. In fact, this mechanism is probably used by the +exporter to bind names into the importer's namespace. + +=item * + +The currently compiling Perl parser is switched by modifying +C<< COMPILING::<$?PARSER> >>. Lexically scoped parser changes +should temporize the modification. Changes from here to +end-of-compilation unit can just assign or bind it. In general, +most parser changes involve deriving a new grammar and then pointing +C<< COMPILING::<$?PARSER> >> at that new grammar. Alternately, the +tables driving the current parser can be modified without derivation, +but at least one level of anonymous derivation must intervene from +the standard Perl grammar, or you might be messing up someone else's +grammar. Basically, the current grammar has to belong only to the +current compiling scope. It may not be shared, at least not without +explicit consent of all parties. No magical syntax at a distance. +Consent of the governed, and all that. + +=item * + +The double-underscore forms are going away: + + Old New + --- --- + __LINE__ $?LINE + __FILE__ $?FILE + __PACKAGE__ $?PACKAGE + __END__ =begin END + __DATA__ =begin DATA + +The C<=begin END> pod stream is special in that it assumes there's +no corresponding C<=end END> before end of file. The C<DATA> +stream is no longer special--any POD stream in the current file +can be accessed via a filehandle, named as C<< %=POD{'DATA'} >> and such. +Alternately, you can treat a pod stream as a scalar via C<$=DATA> +or as an array via C<@=DATA>. Presumably a module could read all +its COMMENT blocks from C<@=COMMENT>, for instance. Each chunk of +pod comes as a separate array element. You have to split it into lines +yourself. Each chunk has a C<.range> property that indicates its +line number range within the source file. + +The lexical routine itself is C<&?ROUTINE>; you can get its name with +C<&?ROUTINE.name>. The current block is C<&?BLOCK>. If the block has any +labels, those shows up in C<&?BLOCK.labels>. Within the lexical scope of +a statement with a label, the label is a pseudo-object representing +the dynamic context of that statement. (If inside multiple dynamic +instances of that statement, the label represents the innermost one.) +When you say: + + next LINE; + +it is really a method on this pseudo-object, and + + LINE.next; + +would work just as well. You can exit any labeled block early by saying + + MyLabel.leave(@results); + +=item * + +Heredocs allow optional whitespace both before and after terminating +delimiter. Leading whitespace equivalent to the indentation of the +delimiter will be removed from all preceding lines. If a line is +deemed to have less whitespace than the terminator, only whitespace +is removed, and a warning may be issued. (Hard tabs will be assumed +to be C<< ($?TABSTOP // 8) >> spaces, but as long as tabs and spaces are used consistently +that doesn't matter.) A null terminating delimiter terminates on +the next line consisting only of whitespace, but such a terminator +will be assumed to have no indentation. (That is, it's assumed to +match at the beginning of any whitespace.) + +=head1 NOT YET DEFINED + +The following items are not yet defined, but will need to be defined. + +=head2 Form.pm + +These go in the Perl5 to Perl6 conversion table: + + Perl6 Perl5 + ----- ----------------------------------------- + - $% $FORMAT_PAGE_NUMBER + - HANDLE->format_page_number(EXPR) + + - $= $FORMAT_LINES_PER_PAGE + - HANDLE->format_lines_per_page(EXPR) + + - $- $FORMAT_LINES_LEFT + - HANDLE->format_lines_left(EXPR) + + - $~ $FORMAT_NAME + - HANDLE->format_name(EXPR) + + - $^ $FORMAT_TOP_NAME + - HANDLE->format_top_name(EXPR) + + - $: $FORMAT_LINE_BREAK_CHARACTERS + - IO::Handle->format_line_break_characters + + - $^L $FORMAT_FORMFEED + - IO::Handle->format_formfeed + + - $^A $ACCUMULATOR + + +=head1 Additions + +Please post errors and feedback to perl6-language. If you are making +a general laundry list, please separate messages by topic. + +=for vim:set expandtab sw=4: