value[index]
Lists, strings, and hashes are indexed with square brackets.
List and string indexing is 1-based. 0 is not a valid index number for a string or list.
Besides using an integer to index a list or string, you can use an integer range. Using a descending range will return the elements in reverse order.
Lists and strings can use negative indices to index from the end.
So, -1 is the first element from the end (that is, the last element if counting with positive integers), -2 is the second from the end, etc.
Indexing with a range may use a mix of positive and negative, such as 7 .. -1 (start at 7, end with last element).
Normally, an invalid index generates an exception.
To return an alternate value instead, inside the square brackets you follow the index with a semicolon and the alternate value.
value[index; alternate]
Evaluation of the alternate value uses short-circuiting (no evaluation of complicated alternate value if not needed).
Strings are indexed by code point, not by code unit.
A descending range can be used to reverse the code points. This is not a string reversal by graphemes (which can be accomplished in other ways).
Indexing a string returns a code point or list of code points. Use the s2s() function to return a string built by indexing.
You can also use the s2cp() function to get a code point or list of code points (or s2gc() to get graphemes), and the cp2s() function to convert a code point or list of code points (including graphemes) to a string.
A hash may be indexed with a string or number. Note that "1" is a different index than 1.
As a short-hand way to index by string, use a single quote mark immediately after a variable name or closing square bracket. Short-hand indexing is limited to the code points used for tokens.
# All the following are true. x["string"] == x'string y[123]'abc == y[123]["abc"] z["123"] == z'123 z["123"]["abc"] == z'123'abc
Lists, strings, and hashes may be indexed with lists of appropriate values. For example, ["a", "b", 3, 4][[1, 4]] would yield ["a", 4] as the result.
Ranges can be used within lists used to index lists or strings (but not hashes).
Ranges in langur may be indicated with the .. (double dot) operator.
example | notes |
1 .. 7 | ascending range from 1 to 7 valid for indexing |
7 .. 1 | descending range from 7 to 1 valid for indexing |
3.14 .. -7.7 | descending range from 3.14 to -7.7 not valid for indexing |
1 .. var | range from 1 to the value of var might be valid for indexing |
'a' .. 'z' | code point (integer) range valid for indexing |
"a" .. "z" | string range not valid for indexing |
dt/2020-10-1/ .. dt/2020-11-01/ | date/time range not valid for indexing |
dr/20y/ .. dr/30y/ | duration range not valid for indexing |
Ranges are inclusive for both the start and end.
The start and end must be of the same type and must be comparable with > and < type operators. Ranges may be made of numbers (including code points), strings, date-times, or durations.
Ranges may be descending as well as ascending.
Number ranges not used for indexing are not restricted to integers. For example, you might use a decimal range with the series() function (such as series 1.0 .. 3.5, 0.1).
You can index on a range to get the start and end of it. As a consequence, the len() function will return 2 for a range.