2013-09-19 3 views
1

Я использую, чтобы знать, как это сделать. Я просто хочу захватить подстроку большую строку и назначить ее скалярному. Так вот сценарий Perl я изрубил ...Как получить только один скаляр из команды split perl

#!/usr/local/bin/perl 
use warnings; 
use strict; 

my $thing = "thing1 thing2 thing3 thing4 thing5 thing6 thing7 thing8"; 
my $thing4 = ${@{split (/ /, $thing)}[3]}; 
print "thing4 is $thing4\n"; 

... выход я получаю это ...

Use of uninitialized value $_ in split at ./perlex.pl line 6. 
Can't use string ("0") as an ARRAY ref while "strict refs" in use at ./perlex.pl line 6. 

... Я надеялся, что выход будет ...

thing4 is thing4 

Что я здесь делаю неправильно?

+1

Я не могу воспроизвести эту точную ошибку, какую версию perl вы используете? – amon

+1

Связанные: http://stackoverflow.com/q/7997616 – mob

ответ

6

Вы значительно переделали линию split. Это должно быть просто:

my $thing4 = (split//, $_)[3]; 
4

Это выражение

${@{split (/ /, $_)}[3]} 

означает:

  • разделить переменную $_ на всех пространствах. Это происходит в скалярном контексте, поэтому он оценивает количество полей, например. 5
  • @{ ... } рассматривает внутреннее выражение как ссылку на массив и разыгрывает его как массив, например. @5.
  • @{ ... }[3] выбирает четвертый элемент этого массива с довольно сомнительным синтаксисом. Например. @5[3] который может быть "foo", но, вероятно, undef.
  • ${ ... } рассматривает это как скалярную ссылку и разыгрывает ее. Например. ${foo}

Результат: хаос. Вы действительно хотели:

my $some_thing = (split)[3]; 
+0

oops! спасибо, я заменил '$ _' на' $ thing'. –

Смежные вопросы