Что происходит в цикле foreach Perl? - PullRequest
1 голос
/ 28 апреля 2010

У меня есть этот код Perl:

foreach (@tmp_cycledef)
{
 chomp;
 my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3);
 $cycle_code =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
 $close_day  =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
 $first_date =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;

 #print "$cycle_code, $close_day, $first_date\n";
 $cycledef{$cycle_code} = [ $close_day, split(/-/,$first_date) ];
}

Значение tmp_cycledef получается из вывода SQL-запроса:

select cycle_code,cycle_close_day,to_char(cycle_first_date,'YYYY-MM-DD')
  from cycle_definition d
  order by cycle_code;

Что именно происходит внутри for цикла?

Ответы [ 6 ]

2 голосов
/ 28 апреля 2010

Да, я удивлен, что никто не исправил это для вас:)

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

Я думаю, что это должно быть то же самое, что обрезка пробелов вокруг разделителя в split :

foreach (@tmp_cycledef)
    {
    s/^\s+//; s/$//; #leading and trailing whitespace on the whole string
    my ($cycle_code, $close_day, $first_date) = split(/\s*\|\s*/, $_, 3);

    $cycledef{$cycle_code} = [ $close_day, split(/-/,$first_date) ];
    }

Ключом к размышлению о split является рассмотрение того, какие части строки вы хотите выбросить, а не только то, что разделяет нужные вам поля.

0 голосов
/ 28 апреля 2010
  • Ваш запрос дает набор строк, которые хранятся в массиве @tmp_cycledef.
  • Мы перебираем каждую строку в результат использования: foreach (@tmp_cycledef).
  • Строки результата могут иметь конечный символ новой строки, мы избавляемся от них используя chomp.
  • Далее мы split строка (которая не в $_) на трубе и назначьте первые 3 штуки до $cycle_code, $close_day и $first_date соответственно.
  • Разделенные фигуры могут иметь ведущие и замыкающие пробелы, следующие 3 линии должны удалить ведущие и замыкающий пробел в 3 переменные.
  • Наконец мы делаем запись в хэш %cycledef. Ключевое использование $cycle_code и значение массив которого первый элемент $close_day и остальные элементы кусочки, полученные после расщепления $first_date на дефисе.
0 голосов
/ 28 апреля 2010

@tmp_cycledef: выходные данные sql-запроса хранятся в этом массиве

foreach (@tmp_cycledef): для каждого элемента в этом массиве.

chomp : удалить символ \ n с конца каждого элемента.

my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3);

разделить элементы на 3 части и назначить переменную каждому из разделенных элементов. части разделения «разделяются (/ PATTERN /, EXPR, LIMIT)»

$cycle_code =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
$close_day =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
$first_date =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;

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

0 голосов
/ 28 апреля 2010

Каждая строка в @tmp_cycledef состоит из строки, отформатированной после «цикл_кода | конец_дня | первая_дата».

my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3);

Разделить строку на три части. Следующие регулярные выражения используются для удаления начальных и конечных пробелов.

Последняя инструкция цикла создает запись в словаре $cycledef, проиндексированную $cycle_code. Запись форматируется по следующей схеме:

[ $close_day, YYYY, MM, DD ]

, где $first_date = "YYYY-MM-DD".

0 голосов
/ 28 апреля 2010

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

Вы получаете запись из @tmp_cycledef и отрываетесь от новой строки вконец и разделить его на три переменные: затем, как сказал С.Марк, каждое регулярное выражение подстановки удаляет начальные и конечные пробелы для каждой из трех переменных.Наконец, значения помещаются в хеш в виде списка, а над ним закомментирован некоторый код отладки.

hth

0 голосов
/ 28 апреля 2010

Для части регулярного выражения s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/ выполнить удаление начальных и конечных пробелов

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