issue :
* space is allowed (OR NOT ???)
between qq ( and friends ) and following delimiter
qq ( ... ) ;
qq ) ... ( ;
qq ' ... ' ; ???
qq | ... | ;
qq # ... # ; ???
qq : ... : ; ???
( to distinguish from usual subs , where this should be
subqq _( ... ) ;
subqq( ... ) ;
)
>From `perldoc perlop` :
> There can be whitespace between the operator and the quoting
> characters, except when "#" is being used as the quoting character.
> "q#foo#" is parsed as the string "foo", while "q #foo#" is the
> operator "q" followed by a comment. Its argument will be taken from
> the next line. This allows you to write:
>
> s {foo} # Replace foo
> {bar} # with bar.
another issue :
I understood that
things like that will be possible ( or NOT ?? ) :
M. Lazzaro -- long time ago :
>
> my Pet @list = qm : << name type breed >> {
> fido dog collie
> fluffy cat siamese
> };
>
that probably means that ":" should be not allowed as a delimiter
arcadi
Joseph Ryan writes:
> First of all, apologies for sending through Hotmail; I'm home for the
> weekend, and have no access to email. However, I figured I should
> send this out as soon as I finished so that people have something to
> think about besides numbers :)
>
> Anyways, here's a first draft of the string documentation, I've put
> comments in as:
>
> # comment.
>
> Known issues:
>
> - Larry was never specific as to how hashes interpolate; anyone have
> any ideas?
> - References and Object stringification hasn't been defined.
> - If References interpolate in some sort of readable way, how do
> multi-leveled references interpolate, and how do self-referring
> data structures interpolate?
> - I assumed escaping would be similar to perl5's, so I just used the
> table from perl5's perlop.
>
>
> Joseph F. Ryan
> [EMAIL PROTECTED]
>
>
>
> =pod
>
> =head1 Strings
>
> A string is a literal value that represents a sequence of characters.
> A string object is formed when a sequence of characters is enclosed in
> one of the quoting operators, of which there are 3 types:
> Interpolating, Non-Interpolating, and Here-Docs; each are explained
> below.
>
> =head2 Non-Interpolating Constructs
>
> Non-Interpolating constructs are strings in which expressions do not
> interpolate, or expand. The one exception to this is that the
> backslash character, \, will always escape the character that
> immediately follows the it.
>
> The base form for a non-interpolating string is the single-quoted
> string: 'string'. However, non-interpolating strings can also be formed
> with the q() operator. The q() operator allows strings to be made with
> any non-space, non-letter, non-digit character as the delimeter instead
> of '. In addition, if the starting delimeter is a part of a paired
> set, such as (, [, <, or {, then the closing delimeter may be the
> matching member of the set. In addition, the reverse holds true;
> delimeters which are the tail end of a pair may use the starting item
> as the closing delimeter.
>
> =over 3
> Examples:
>
> $string = 'string' # $string = 'string'
> $string = q|string| # $string = 'string'
> $string = q(string) # $string = 'string'
> $string = q]string[ # $string = 'string'
> =back
>
>
> =head3 Embedding Interpolated Strings
>
> It is also possible to embed an interpolating string within a non-
> interpolating string by the use of the \qq{} construct. A string
> inside a \qq{} constructs acts exactly as if it were an interpolated
> string. Note that any end-brackets, "}", must be escaped within the
> the \qq{} construct so that the parser can read it correctly.
>
> =over 3
> Examples ( assuming C<< $var="two" >> ):
>
> $string = 'one \qq{$var} two' # $string = 'one two three'
> $string = 'one\qq{ {$var\} }two' # $string = 'one {two} three'
> =back
>
> =head3 <>; expanding a string as a list.
>
> A set of braces is a special op that evaluates into the list of words
> contained, using whitespace as the delimeter. It is similar to qw()
> from perl5, and can be thought of as roughly equivalent to:
> C<< "STRING".split(' ') >>
>
> =over 3
> Examples:
>
> @array = <one two three>; # @array = ('one', 'two', 'three');
> @array = <one <\> three>; # @array = ('one', '<>', 'three');
> =back
>
> =head2 Interpolating Constructs
>
> Interpolating constructs are another form of string in which variables
> that are embedded into the string are expanded into their value at
> runtime. Interpolated strings are formed using the double quote:
> "string". In addition, qq() is a synonym for "", which is similar to
> q() being a synoynm for ''. The rules for interpolation are as
> follows:
>
> =head3 Interpolation Rules
>
> =over 3
>
> =item Scalars: C<"$scalar">, C<"$(expression)">
> Non-Reference scalars will simply interpolate as their value. $()
> forces its expression into scalar context, which is then handled as
> either a scalar or a reference, depending on how expression evaluates.
>
> =item Lists: C<"@list">, C<"@(expression)">
> Arrays and lists are interpolated by joining their list elements by the
> list's separator property, which is by default a space. Therfore, the
> following two expressions are equivalant:
>
> =over 3
> print "@list";
> print "" ~ @list.join(@list.separator) ~ "";
> =back
>
> =item Hashes: C<"%hash">, C<"%(expression)">
> # RFC 237 proposes: join( $/, map { qq($_$"$hash{$_}) } keys %hash )
> # However, Larry never made any definite decision.
> # Well, maybe he did, and just didn't tell anyone :)
>
> =item Subroutines and Methods: C<"&sub($a1,$a2)">, C<"$obj.meth($a)">
> Subroutines and Methods will interpolate their return value into the
> string, which will be handled in whichever type the return value is.
> Same for object methods. Note that parens B<are> required during
> interpolation so that the parser can disambiguate between object
> methods and object members.
>
> =item References C<"$ref">
> # Behaivor not defined
>
> =item Default Object Stringification C<"$obj">
> # Behaivor not defined
>
> =item Escaped Characters
> # Basically the same as Perl5; also, how are locale semantics handled?
>
> \t tab
> \n newline
> \r return
> \f form feed
> \b backspace
> \a alarm (bell)
> \e escape
> \b10 binary char
> \o33 octal char
> \x1b hex char
> \x{263a} wide hex char
> \c[ control char
> \N{name} named Unicode character
>
> =item Modifiers: C<\Q{}>, C<\L{}>, C<\U{}>
>
> Modifiers apply a modification to text which they enclose; they can be
> embedded within interpolated strings.
>
> \L{} Lowercase all characters within brackets
> \U{} Uppercase all characters within brackets
> \Q{} Escape all characters that need escaping
> within the current string (except "}")
>
> =back
>
> =head3 Stopping Interpolation (\Q)
>
> Within an interpolated string, interpolation of expressions can be
> stopped by \Q.
>
> =over 3
> Example:
> @list = (1,2);
> print "@list\Q[0]"; # prints '1 2[0]'
> =back
>
> =head3 Embedding non-interpolated constructs: C<\q{}>
>
> Similar to embedding an interpolated string within a non-interpolated
> string, it is possible to embed a non-interpolated string within a
> interpolated string with \q{}. Any characters within a \q{} construct
> are treated as if they were in an non-interpolated string.
>
> =over 3
> Example:
> "string \q{$variable}" # $variable will not be interpolated
> =back
>
> # from perl5's perlop
> =head3 C<qx()>, backticks (C<``>)
>
> A string which is (possibly) interpolated and then executed as a system
> command with /bin/sh or its equivalent. Shell wildcards, pipes, and
> redirections will be honored. The collected standard output of the
> command is returned; standard error is unaffected. In scalar context,
> it comes back as a single (potentially multi-line) string, or undef if
> the command failed. In list context, returns a list of lines (however
> you've defined lines with $/ or $INPUT_RECORD_SEPARATOR), or an empty
> list if the command failed.
>
> =head2 Here Docs
>
> # modified from perl5's perlop
> A line-oriented form of quoting is based on the shell "here-document"
> syntax. Following a << you specify a string to terminate the quoted
> material, and all lines following the current line down to the
> terminating string are the value of the item. The terminating string
> may be either an identifier (a word), or some quoted text. If quoted,
> the type of quotes you use determines the treatment of the text, just
> as in regular quoting. An unquoted identifier works like double quotes.
> The terminating string must appear by itself, and any preceding or
> following whitespace on the terminating line is discarded.
>
> =over 3
> Examples:
>
> print << EOF;
> The price is $Price.
> EOF
>
> print << "EOF"; # same as above
> The price is $Price.
> EOF
>
> print << "EOF"; # same as above
> The price is $Price.
> EOF
>
> print << `EOC`; # execute commands
> echo hi there
> echo lo there
> EOC
>
> print <<"foo", <<"bar"; # you can stack them
> I said foo.
> foo
> I said bar.
> bar
>
> myfunc(<< "THIS", 23, <<'THAT');
> Here's a line
> or two.
> THIS
> and here's another.
> THAT
>
> =back
>
> Don't forget that you have to put a semicolon on the end to finish the
> statement, as Perl doesn't know you're not going to try to do this:
>
> =over 3
> print <<ABC
> 179231
> ABC
> + 20;
> =back
>
> If you want your here-docs to be indented with the rest of the code,
> you'll need to remove leading whitespace from each line manually:
>
> =over 3
> ($quote = <<'FINIS') =~ s/^\s+//gm;
> The Road goes ever on and on,
> down from the door where it began.
> FINIS
> =back
>
> If you use a here-doc within a delimited construct, such as in s///eg,
> the quoted material must come on the lines following the final
> delimiter. So instead of:
>
> =over 3
> s/this/<<E . 'that'
> the other
> E
> . 'more '/eg;
> =back
>
> you have to write
>
> =over 3
> s/this/<<E . 'that'
> . 'more '/eg;
> the other
> E
> =back
>
> Also note that with single quoted here-docs, backslashes are not
> special, and are taken for a literal backslash, a behaivor that is
> different from normal single-quoted strings.
>
> =head2 Gory Details of parsing quoted constructs
>
> No string section would be complete without a "Gory details of parsing
> quoted constructs"; however, since the current implementation in P6C
> doesn't have support for \Q, \Q{}, \L{}, \U{}, \N{name}, or \x{}, the
> implementation may have to change. If you really need your blood and
> guts, please see P6C/Tree/String.pm for the current string-parsing
> semantics.
>
> =cut
>
> _________________________________________________________________
> The new MSN 8: smart spam protection and 2 months FREE*
> http://join.msn.com/?page=features/junkmail
>
>