Глядя на документацию для split()
, мы видим это:
Разбивает строку EXPR на список строк и возвращает список в контексте списка или размер списка в скалярном контексте
Итак, мы можем получить список в массиве:
my @net_info = split(/\//,'10.0.0.2/8');
И затем получить последний элемент этого массива:
my $cidr = $net_info[-1];
Но вы можете сделать это в одной строке кода, используя список срезов . Синтаксис для фрагмента списка:
( LIST )[ INDEX ]
Вы немного растерялись и использовали это:
${ LIST }[ INDEX ]
Итак, правильный синтаксис вашей проблемы:
my $cidr = ( split(/\//,'10.0.0.2/8') )[-1];
Кроме того, ваш код может быть немного проще для понимания, если вы используете другой разделитель для регулярного выражения, который является первым аргументом split()
- таким образом избавляя от необходимости избегать косой черты.
my $cidr = ( split(m[/],'10.0.0.2/8') )[-1];
Обновление: Учитывая, что маска сети содержит только одну косую черту, было бы проще написать что-то вроде:
my ($ip, $cidr) = split(m[/], '10.0.0.2/8');
Или (используя undef
, чтобы удалить первое значение, возвращаемое split()
:
my (undef, $cidr) = split(m[/], '10.0.0.2/8');
Обновление 2: И объяснить, что происходит в вашем исходном коде. Вы случайно использовали эту конструкцию:
${ ARRAYREF }[ INDEX ]
Какова общая версия способа получения значения элемента массива, когда у вас есть только ссылка на массив (чаще всего, конечно, вы используете ARRAYREF->[ INDEX ]
).
Поскольку выражение в ${ ... }
должно вычисляться как ссылка на массив, а ссылки на массивы всегда являются скалярными значениями, Perl оценивает выражение в скалярном контексте. И как мы видим из выдержки из документации выше, в скалярном контексте split()
возвращает количество элементов в списке, которое будет равно 2. А «2» не является ссылкой на массив, поэтому вы получаете ошибку, которую вы ' видел.