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

Reply via email to