#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
.