The subrange assigment replaces a specified subsequence of a list or string with a supplied subsequence. The allowed forms are:
variable[start-index-expr..end-index-expr] = result-expr object-expr.name[start-index-expr..end-index-expr] = result-expr object-expr.(name-expr)[start-index-expr..end-index-expr] = result-expr $name[start-index-expr..end-index-expr] = result-expr
As with indexed assigments, the first form writes into a variable, and the last
three forms write into a property. The same errors (E_TYPE,
E_INVIND, E_PROPNF and E_PERM for lack of read/write
permission on the property) may be raised. If variable does not yet have
a value (i.e., it has never been assigned to), E_VARNF will be raised.
As before, the $ expression can be used in either start-index-expr
or end-index-expr, meaning the length of the original value of the
expression just before the [...] part.
If start-index-expr or end-index-expr is not an integer, if the value
of variable or the property is not a list or string, or result-expr
is not the same type as variable or the property, E_TYPE is
raised. E_RANGE is raised if end-index-expr is less than zero
or if start-index-expr is greater than the length of the list or string
plus one. Note: the length of result-expr does not need to be the same
as the length of the specified range.
In precise terms, the subrange assigment
v[start..end] = value
is equivalent to
v = {@v[1..start - 1], @value, @v[end + 1..$]}
if v is a list and to
v = v[1..start - 1] + value + v[end + 1..$]
if v is a string.
The assigment expression itself returns the value of result-expr. For
the following examples, assume that l initially contains the list
{1, 2, 3} and that s initially contains the string "foobar":
l[5..6] = {7, 8} error--> E_RANGE
l[2..3] = 4 error--> E_TYPE
l[#2..3] = {7} error--> E_TYPE
s[2..3] = {6} error--> E_TYPE
l[2..3] = {6, 7, 8, 9} => {6, 7, 8, 9}
l => {1, 6, 7, 8, 9}
l[2..1] = {10, "foo"} => {10, "foo"}
l => {1, 10, "foo", 6, 7, 8, 9}
l[3][2..$] = "u" => "u"
l => {1, 10, "fu", 6, 7, 8, 9}
s[7..12] = "baz" => "baz"
s => "foobarbaz"
s[1..3] = "fu" => "fu"
s => "fubarbaz"
s[1..0] = "test" => "test"
s => "testfubarbaz"