Perl присвоение массива @ARGV переменной - PullRequest
2 голосов
/ 17 марта 2020

Когда я присваиваю массив Perl @ARGV переменной, если я не использую кавычки, он дает мне количество строк в массиве, а не строки в массиве.

Как это называется - я думал, что это разыменование, но это не так. Прямо сейчас я называю это еще одной вещью, которую мне нужно запомнить в Perl.

#!/usr/bin/perl

use strict ;
use warnings;

my $str = "@ARGV" ;
#my $str = @ARGV ;
#my $str = 'geeks, for, geeks';
my @spl = split(', ' , $str);

foreach my $i (@spl) {
        print "$i\n" ;
}

Ответы [ 4 ]

5 голосов
/ 17 марта 2020

Если вы присвоите массив скаляру в Perl, вы получите количество элементов в массиве.

my @array = (1, 1, 2, 3, 5, 8, 13);

my $scalar = @array; # $scalar contains 7

Это называется «вычислением массива в скалярном контексте».

Если вы развернете массив в строке в двойных кавычках в Perl, вы получите элементы массива, разделенные пробелами.

my @array = (1, 1, 2, 3, 5, 8, 13);

my $scalar = "@array"; $scalar contains '1 1 2 3 5 8 13'

Это называется «интерполяцией массива в строка в двойных кавычках ".

На самом деле, во втором примере элементы разделяются текущим содержимым переменной $". И значением этой переменной по умолчанию является пробел. Но вы можете изменить его.

my @array = (1, 1, 2, 3, 5, 8, 13);

$" = '+';
my $scalar = "@array"; $scalar contains '1+1+2+3+5+8+13'

Чтобы сохранить ссылку на массив, вы либо берете ссылку на массив.

my $scalar = \@array;

Или создаете новый анонимный массив, используя элементы исходного массива.

my $scalar = [ @array ];

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

4 голосов
/ 17 марта 2020

Perl работает по контексту. То, что вы видите здесь, является скалярным в сравнении с контекстом массива. В скалярном контексте вы хотите одну вещь, поэтому Perl дает вам одну вещь, которая, вероятно, имеет смысл. Признайте контекст, и вы, вероятно, сможете выяснить, что происходит.

Когда у вас есть скаляр в левой части задания, у вас есть скалярный контекст, потому что вы хотите получить одну вещь:

my $one_thing = ...

Поместите массив справа, и вы получите массив в скалярном контексте. Дизайн Perl решил, что наиболее распространенная вещь, которую люди, вероятно, хотят в этом случае, это количество элементов:

my $one_thing = @array;

Это работает и с некоторыми другими встроенными функциями. Встроенная функция localtime возвращает единственную строку в скалярном контексте (временную метку):

my $uid = localtime;  # Tue Mar 17 11:39:47 2020

Но в контексте массива вам может потребоваться несколько вещей (где это может быть два, или один, или ноль, или десять тысяч или ...). В этом случае localtime возвращает список вещей:

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
    localtime();

Хотя вы уже знаете это, вероятно. Оператор + использует свои операнды в качестве чисел, но оператор . использует их как строки: философия

my $sum = '123' + 14;
my $string = '123' . 14;

Perl заключается в том, что он попытается сделать то, что глаголы ( операторы, встроенные функции, функции) пытаются сделать, а не то, что могут означать существительные (тип переменной или значения). Многие языки говорят глаголам, что делать, основываясь на существительных, поэтому встраивание Perl в один из этих ментальных модулей обычно не работает. Вам не нужно много запоминать; Я делал это довольно давно, и я до сих пор часто обращаюсь к документам.

Мы go изучили множество философских объяснений в Learning Perl.

2 голосов
/ 17 марта 2020

Идиома, которую вы ищете, является одной из

my $str = \@ARGV;
my $str = [ @ARGV ];

Они оба присваивают массив ссылка скалярной переменной $str. Затем вы можете вернуть элементы @ARGV, когда вы разыменовываете $str. Например,

for my $i (@$str) {
    print "$i\n"; 
}

(Некоторые люди предпочитают @{$str}, что делает то же самое)

\ - это ссылка оператор , который возвращает ссылку на все, что находится справа.

[...] создает новый массив ссылку из того, что содержится в скобках.

"@array" - операция строкового преобразования в массиве, эквивалентная join($", @array)

И, наконец, скалярное присвоение из массива, например

$n = @array

возвращает количество элементов в массиве.

0 голосов
/ 22 марта 2020

Иногда может потребоваться общее количество элементов в массиве. Поскольку такие ситуации часто встречаются, нам также необходимо узнать, как получить общее число.

@array = ("a".."z");

$re = $#array;
print ("$re\n");

Нам может понадобиться добавить единицу к числу, которое мы получаем, чтобы достичь общего числа.

$ay = ("a", "b", "c");

$re = $#ay;

$re = $re +1;

print ("$re\n");

результат: 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...