Perl. Интерполяция массивов в строках. Почему строка "2 * 4" преобразуется в 2 в числовом контексте?

Рейтинг: 0Ответов: 2Опубликовано: 29.03.2023

Здраствуйте!

Читаю книгу по языку программирования 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" ... тут имеются ввиду сами значение или их индексы ?

Ответы

▲ 0Принят

Почему строка "2 * 4" преобразуется в 2 в числовом контексте ?

Потому что такова судьба языков программирования с нестрогой типизацией.

тут имеются ввиду сами значение или их индексы

Индексы, как результат интерпретации "2 * 4" => 2, $y = 2-1, получаем $fred[1]

А вообще, очень плохой пример. Я б так написал:

$x = sprintf 'This is %s\'s place', $fred[$y-1];

И вообще, use PBP (см. раздел "Policies")! (на русском, очень приблизительно)

▲ 0

По-поводу преобразования строки в число. Тут все просто, строка сканируется до тех пор, пока её можно интерпретировать как число, всё остальное отбрасывается.

То есть, если строка будет начинаться с символов, отличных от цифр, то она будет целиком отброшена. Если строка начнётся с цифр, то она будет интепретироваться как число до первого не числового символа.

Исключением тут выступает любой пробельный символ, например \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