Доступ к элементу при разбиении строки - PullRequest
1 голос
/ 29 мая 2019

Я хочу получить последний элемент массива. Массив - это разделенная строка, полученная следующим образом:
my @net_info = split(/\//,'10.0.0.2/8');

Меня интересует только последний элемент массива, то есть значение CIDR в одной строке. Я думал о:
my $cidr = ${split(/\//,'10.0.0.2/8')}[-1];

но это привело к:
Can't use string ("2") as an ARRAY ref while "strict refs" in use at...

Возможно ли получить последний элемент напрямую? Каков правильный синтаксис для его достижения?

Ответы [ 2 ]

4 голосов
/ 29 мая 2019

Глядя на документацию для 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» не является ссылкой на массив, поэтому вы получаете ошибку, которую вы ' видел.

1 голос
/ 29 мая 2019

Правильный синтаксис:

my $cidr = (split(/\//,'10.0.0.2/8'))[-1];
...