Как оператор diamond работает с массивом в качестве аргумента

#arrays #string #perl #io #daemon

#массивы #строка #perl #io #демон

Вопрос:

У меня есть массив, @address нулевой элемент которого содержит несколько строк. Я не могу найти пример работы оператора diamond с @array в качестве аргумента. (как он «разбивает» строки?)

 use Mojo::Loader qw/ data_section /;

my @address =  data_section 'main', 'address_strings';


while( my $line = <@address> ) {
  print $line;
}


1;


__DATA__
@@ address_strings
"010101, УУУ обл., м. Тернопіль, вул. ВВВ, буд. 0101, 01"
"020202, ЛЛЛ обл., ААА район, село ФФФ, ВУЛИЦЯ ШШШ, будинок 01"
"030303, м.ЮЮЮ, ЮЮЮ р-н, вул. ЛЛЛ, буд.01, офіс 01"
  

UPD
Чтение из <> оператора doc позволяет использовать глобус или дескриптор файла, но в моем случае это просто массив из одной строки.

 my @arr = <<TEXT;
many
lines
TEXT

while( my $line =  <@arr> ) {
    print ">>$line<<n";
}
  

<> Делает что-то волшебное для этого случая? Вы можете заметить, что строки разделены

Ответ №1:

Это … не то, что делает оператор diamond, поэтому вы не можете найти никаких примеров.

Вам нужно только:

 foreach my $line ( @address ) { 
  print $line;
}
  

<> обозначает чтение из дескриптора файла и @address не является дескриптором файла. Это даже не массив файловых дескрипторов.

Теоретически вы могли бы сделать

 while ( my $line = <DATA> ) { 
   print $line; 
}
  

Который, поскольку DATA является дескриптором файла, <> запускает одну запись, прочитанную из этого дескриптора файла. (граница записи по умолчанию имеет перевод строки, но вы можете изменить $/ )

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

Комментарии:

1. Обратите внимание, что при непосредственном чтении данных также будет считываться, @@ address_strings который, вероятно, скрывает Mojo::Loader’s data_section.

2. Да, хороший момент. Не имело бы большого смысла для OP; Я уточню, что это подразумевается в качестве примера.

3. @Sobrique: Я понимаю, что официальный документ допускает только глобус или дескриптор файла в качестве аргумента, но в моем случае есть массив из одной строки. И я не могу найти, где это задокументировано

Ответ №2:

<> потенциально это два разных оператора, glob или readline . Если в нем содержится простая скалярная переменная или простое слово, то это операция чтения строки, а аргументом является используемый дескриптор файла. В противном случае это глобальная операция, и аргумент обрабатывается как имена файлов, разделенные пробелами (или подстановочные знаки имени файла для расширения).

Когда <> выполняется глобальная операция, она обрабатывается как контекст с двойным ключом, а массивы интерполируются путем объединения с $" (по умолчанию используется пробел). Так <@x> есть glob "@x" glob join $", @x . Итак, предполагая, что $" значение не изменилось и в элементах @x нет подстановочных знаков, это очень похоже на простое split ' ', "@x" объединение всех элементов вместе пробелами, а затем разделение результатов на пробелы.

Комментарии:

1. в моем случае аргументом не является ни glob , ни filehandle , но ошибки нет

2. @muhana он выполняет глобализацию. не уверен, почему вы думаете, что это не так? глобус против строки чтения определяется чисто синтаксически; если то, что находится в <>, не является простой скалярной переменной или простым словом, это глобус

3. Можете ли вы взглянуть на обновленный вопрос. Я не понимаю, почему мой @arr является GLOB . Это массив из одной строки.

4. @muhana: опять же, <> всегда является глобусом, за исключением случаев, когда то, что находится внутри, является либо простым словом (например <FH> ), либо простой скалярной переменной (например <$fh> ). это определяется при компиляции кода, а не при запуске, поэтому он понятия не имеет, сколько элементов в массиве; это зависит только от того, как выглядит ваш код. все, кроме этих двух, является глобусом. который, как объяснено, часто ведет себя как split ' ', "@arr" (хотя, если вы действительно хотите разделить, вы должны это сделать)

Ответ №3:

Взгляните на perldoc -f glob.

Типичным использованием было бы:

 my @suffix = qw(*.yaml *.json);
my @yaml = <@suffix>;
# or directly
my @yamlfiles = <*.yaml *.json>;
  

Поэтому будьте осторожны при использовании его для данных, которые потенциально могут быть шаблоном имени файла 😉

Комментарии:

1. в моем случае аргументом не является glob .