Perl, как я могу использовать массив, не назначая его сначала переменной? - PullRequest
1 голос
/ 18 декабря 2010

Вот что я сейчас делаю в своей программе

@array = split /\n/, $longstring;
$data = $array[14];

Я действительно хочу только извлечь элемент в позиции 14 из массива и использовать его, остальные вещи в строке для меня бесполезны. Я знаю, что на таком языке, как Java, я мог бы сделать что-то вроде этого

$data = (split /\n/, $longstring)[14];

это то, что я хочу сделать, но в Perl.

Так как мне получить доступ к элементам массива без необходимости присваивать массив переменной сначала?

редактировать: хм, хорошо, как насчет этого

долгий путь

my $data = "abc\nd^e^f\nghi";
my @a = split (/\^/, (split /\n/, $data)[1]);
print $a[2];
__OUTPUT__
f

короткий путь

my $data = "abc\nd^e^f\nghi";
my $a = split (/\^/, (split /\n/, $data)[1])[2]; # line 60
print $a;
__OUTPUT__
syntax error at script.pl line 60, near ")["
Execution of script.pl aborted due to compilation errors.

это смущает меня больше, чем обычно, так как работает на внутреннем разделении, но не на внешнем разделении

изменить 2:

Я немного запутался, почему эти две строки различны

my $a = (split  /\^/, (split /\n/, $data)[1])[2]; # works
my $a =  split (/\^/, (split /\n/, $data)[1])[2]; # doesnt

вот мой мыслительный процесс для 2-й строки, который я написал изначально (другими словами, это то, что я думаю, что делает моя программа)

my $data = "abc\nd^e^f\nghi";
my $a =  split (/\^/, (split /\n/, $data)[1])[2];
my $a =  split (/\^/, ("abc", "d^e^f", "ghi")[1])[2];
my $a =  split (/\^/, "d^e^f")[2];
my $a =  ("d", "e", "f")[2];
my $a =  "f";

Это то, что я ожидаю, может кто-нибудь указать, где мое мышление пошло не так?

Ответы [ 3 ]

8 голосов
/ 18 декабря 2010

Я просто собираюсь объяснить, почему эти строки отличаются:

my $r = (split  /\^/, (split /\n/, $data)[1])[2]; # works
my $r =  split (/\^/, (split /\n/, $data)[1])[2]; # syntax error
my $r = (split (/\^/, (split /\n/, $data)[1]))[2]; # but this works

В Perl вы можете использовать подстрочный индекс массива как [2] в списке в скобках (он называется фрагмент списка ).Но есть другое правило, которое гласит: «Если это похоже на вызов функции, то это вызов функции».То есть, когда у вас есть имя функции (например, split), за которым следует необязательный пробел и открывающая скобка, это вызов функции.Вы не можете подписать вызов функции;вам нужно добавить дополнительный набор скобок вокруг него.Вот почему моя третья строка работает.

На другой ноте, вы никогда не должны говорить my $a или my $b.$a и $b - это специальные переменные пакета, которые используются с sort, и если вы превратили их в лексические выражения, у вас возникнут странные проблемы.Даже если вы не используете sort в данный момент, вы можете добавить его позже.Проще всего просто полностью избежать лексического $a или $b.

Для удобства чтения я мог бы немного отрегулировать пробел и добавить комментарий:

my $r = (split /\^/, (split /\n/, $data)[1] )[2]; # get 3rd field of 2nd line
4 голосов
/ 18 декабря 2010

Вы только что потеряли первый (, попробуйте это:

my $a = (split/\^/, (split /\n/, $data)[1])[2];
1 голос
/ 18 декабря 2010

То, что вы написали, прекрасно.

Вот демонстрация на кодовой панели .

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