Как я могу пропустить строки при прихлебывании файла в Perl?

По умолчанию API Platform использует нельмиокоры, а в конфигурации по умолчанию используется переменная среды CORS_ALLOW_ORIGIN .

При этом вы можете разрешить любой URL с этим конфигом в вашем .env (или .env.local) с CORS_ALLOW_ORIGIN=^https?://.*?$

6
задан brian d foy 22 April 2009 в 19:06
поделиться

2 ответа

Использовать , а вместо foreach :

open FILE, $somefile;
while (<FILE>)                      # <<-- HERE
{
   if (/some_regex/)
   {
      $want_the_next_line = <FILE>;
      $want_the_next_line_after_that = <FILE>;
   }
}

Цикл while будет читать только одну строку из и затем вы можете делать с ним все, что пожелаете в текущей итерации.

Также этот метод поможет вам избежать одновременного чтения всего файла.

Техническая информация: foreach ( ) требует массива, поэтому считывает сразу весь файл, тогда как выражение в цикле while () является скалярным контекстом и проверяется только на «ложные» значения, подобно тому, которое выдает EOF .

11
ответ дан 8 December 2019 в 14:47
поделиться

Вы можете использовать те же приемы в perlfaq5: как изменить, удалить или вставить строку в файл или добавить в начало файла ?:


(предоставлено brian d foy)

Основная идея вставки, изменения или удаления строки из текстового файла заключается в чтении и печати файла до точки, в которую вы хотите внести изменение, внося изменения затем чтение и печать остальной части файла. Perl не обеспечивает произвольный доступ к строкам (особенно с учетом того, что разделитель ввода записей $ / является изменяемым), хотя такие модули, как Tie :: File, могут имитировать его.

Программа Perl для выполнения этих задач принимает базовую форму открытия файла, печати его строк, затем закрываем файл:

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

while( <$in> )
    {
    print $out $_;
    }

    close $out;

В этой базовой форме добавьте части, которые вам нужны для вставки, изменения или удаления строк.

Чтобы добавить строки в начало, напечатайте эти строки перед тем, как войти в цикл, который печатает существующий линии.

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

print $out "# Add this line to the top\n"; # <--- HERE'S THE MAGIC

while( <$in> )
    {
    print $out $_;
    }

    close $out;

Чтобы изменить существующие строки, вставьте код для изменения строк внутри цикла while. В этом случае код находит все версии "perl" в нижнем и верхнем регистре. Это происходит для каждой строки, поэтому убедитесь, что вы должны делать это на каждой строке!

open my $in,  '<',  $file      or die "Can't read old file: $!";
open my $out, '>', "$file.new" or die "Can't write new file: $!";

print $out "# Add this line to the top\n";

while( <$in> )
    {
    s/\b(perl)\b/Perl/g;
    print $out $_;
    }

    close $out;

Чтобы изменить только определенную строку, номер строки ввода, $., Полезен. Сначала прочитайте и распечатайте строки до той, которую хотите изменить. Затем прочитайте единственную строку, которую вы хотите изменить, измените ее и напечатайте. После этого прочитайте остальные строки и напечатайте их:

while( <$in> )   # print the lines before the change
    {
    print $out $_;
    last if $. == 4; # line number before change
    }

my $line = <$in>;
$line =~ s/\b(perl)\b/Perl/g;
print $out $line;

while( <$in> )   # print the rest of the lines
    {
    print $out $_;
    }

Чтобы пропустить строки, используйте циклические элементы управления. Следующий в этом примере пропускает строки комментариев, а последний останавливает всю обработку, когда встречает END или DATA .

while( <$in> )
    {
    next if /^\s+#/;             # skip comment lines
    last if /^__(END|DATA)__$/;  # stop at end of code marker
    print $out $_;
    }

Выполните те же действия, чтобы удалить определенную строку, используя next, чтобы пропустить строки, которые вы не хотите показывать в выводе. В этом примере пропускается каждая пятая строка:

while( <$in> )
    {
    next unless $. % 5;
    print $out $_;
    }

Если по какой-то странной причине вы действительно хотите видеть весь файл сразу, а не обрабатывать строку за строкой, вы можете вставить его (если вы можете уместить все это в память!):

open my $in,  '<',  $file      or die "Can't read old file: $!"
open my $out, '>', "$file.new" or die "Can't write new file: $!";

my @lines = do { local $/; <$in> }; # slurp!

    # do your magic here

print $out @lines;

Модули, такие как File :: Slurp и Tie :: File, также могут помочь с этим. Если вы можете, однако, не читать весь файл сразу. Perl не вернет эту память операционной системе, пока процесс не завершится.

Вы также можете использовать однострочники Perl для изменения файла на месте. Следующее меняет все «Фред» на «Барни» в inFile.txt, перезаписывая файл новым содержимым. С ключом -p Perl оборачивает цикл while вокруг кода, который вы указали с помощью -e, а -i включает редактирование на месте. Текущая строка в $ . С помощью -p Perl автоматически печатает значение $ в конце цикла. Подробности смотрите в perlrun.

perl -pi -e 's/Fred/Barney/' inFile.txt

Чтобы создать резервную копию файла inFile.txt, добавьте расширение -ia ​​для добавления файла:

perl -pi.bak -e 's/Fred/Barney/' inFile.txt

Чтобы изменить только пятую строку, вы можете добавить тестовую проверку $., Номер строки ввода, затем выполняйте операцию только после прохождения теста:

perl -pi -e 's/Fred/Barney/ if $. == 5' inFile.txt

Чтобы добавить строки перед определенной строкой, вы можете добавить строку (или строки!) до того, как Perl напечатает $ _:

perl -pi -e 'print "Put before third line\n" if $. == 3' inFile.txt

Вы даже можете добавить строку в начало файл, поскольку текущая строка печатается в конце цикла:

perl -pi -e 'print "Put before first line\n" if $. == 1' inFile.txt

Чтобы вставить строку после той, которая уже есть в файле, используйте ключ -n. Это' Она похожа на -p за исключением того, что она не печатает $ _ в конце цикла, так что вы должны сделать это самостоятельно. В этом случае сначала напечатайте $ _, затем напечатайте строку, которую вы хотите добавить.

perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt

Чтобы удалить строки, напечатайте только те, которые вы хотите.

perl -ni -e 'print unless /d/' inFile.txt

    ... or ...

perl -pi -e 'next unless /d/' inFile.txt
5
ответ дан 8 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: