Perl. Интерполяция массивов в строках. Почему строка "2 * 4" преобразуется в 2 в числовом контексте?
Здраствуйте!
Читаю книгу по языку программирования Perl, Изучаем Perl 5-е-издание... Не понятно один момент, в книге написано следующее:
Один элемент массива при интерполяции заменяется своим текущим значением, как и следовало ожидать:
@fred = qw (hello dolly);
$y = 2;
$x = "This is $fred[1]'s place";
$x = "This is $fred[$y - 1]'s place";
Индексное выражение вычисляется по правилам обычных выражений, как если бы оно находилось вне строки. Предварительная интерполяция переменных не выполняется. Иначе говоря, если $y содержит строку "2 * 4", то интерполироваться будет элемент 1, а не элемент 7, по тому что "2 * 4" в числовом контексте (значение $y, используемое в числовом выражении) преобразуется в 2 ...
- Почему строка "2 * 4" преобразуется в 2 в числовом контексте ?
- Это же ведь одна строка, и почему вообще именно 2 ?
- Что имеется ввиду -> "Иначе говоря, если $y содержит строку "2 * 4", то интерполироваться будет элемент 1, а не 7" ... тут имеются ввиду сами значение или их индексы ?
Ответы (2 шт):
Почему строка "2 * 4" преобразуется в 2 в числовом контексте ?
Потому что такова судьба языков программирования с нестрогой типизацией.
тут имеются ввиду сами значение или их индексы
Индексы, как результат интерпретации "2 * 4" => 2, $y = 2-1, получаем $fred[1]
А вообще, очень плохой пример. Я б так написал:
$x = sprintf 'This is %s\'s place', $fred[$y-1];
И вообще, use PBP (см. раздел "Policies")! (на русском, очень приблизительно)
По-поводу преобразования строки в число. Тут все просто, строка сканируется до тех пор, пока её можно интерпретировать как число, всё остальное отбрасывается.
То есть, если строка будет начинаться с символов, отличных от цифр, то она будет целиком отброшена. Если строка начнётся с цифр, то она будет интепретироваться как число до первого не числового символа.
Исключением тут выступает любой пробельный символ, например \n, он игнорируется в начале строки.
cat test.pl
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use v5.26.0;
say "a1" + 1;
say "1 " + 1;
say " 24" - 22;
$ perl test.pl
Argument "a1" isn't numeric in addition (+) at test.pl line 8.
1
2
2