perl + как объявить массив - PullRequest
       4

perl + как объявить массив

0 голосов
/ 15 августа 2010

следующий скрипт (test.pl) добавляет текст $ insert [1] между $ first_line [1] и $ second_line [1] в файл myfile.txt и отправляет вывод в output.txt

но если я объявлю массив как

 my $first_line[1]=")"; 
 my $second_line[1]="NIC Hr_Nic ("; 
 my $insert[1]="hello world
                line 2
                line3 "

Я получаю

 syntax error at ./test.pl line 10, near "$first_line["
 syntax error at ./test.pl line 11, near "$second_line["
 syntax error at ./test.pl line 12, near "$insert["
 Execution of ./test.pl aborted due to compilation errors.

как объявить следующие массивы?

примечание: (без массива my скрипт работает нормально)

Lidia

 #!/usr/bin/perl

 # Slurp file myfile.txt into a single string 
 open(FILE,"myfile.txt") || die "Can't open file: $!"; 
 undef $/; 
 my $file = <FILE>; 

 # Set strings to find and insert 
 my $count=1;
 my $first_line[1]=")"; 
 my $second_line[1]="NIC Hr_Nic ("; 
 my $insert[1]="hello world
          line 2 
           line 3 " ;

Ответы [ 2 ]

2 голосов
/ 15 августа 2010

Для составных типов, таких как массивы и хэши, вам нужно всего лишь объявить составную как лексическую переменную:

 my @first_line = ...;

Оттуда вам не нужно объявлять составные элементы, как вы делаете.

Вы можете начать с такой книги, как Изучение Perl , чтобы освоить основы языка.Небольшое предварительное изучение избавит вас от боли и страданий позже.

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


Как сделатьЯ изменяю, удаляю или вставляю строку в файл или добавляю к началу файла?

(предоставлено Брайаном Д. Фой)

Основная идея вставки, изменения илиудаление строки из текстового файла включает в себя чтение и печать файла до точки, в которую вы хотите внести изменения, внесение изменений, затем чтение и печать остальной части файла.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 для изменения файла на месте.Следующее меняет все 'Fred' на 'Barney' в 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
1 голос
/ 15 августа 2010

Вы должны использовать my @first_line = (); для объявления нового пустого массива. Вам не нужно указывать размер.

Но в коде, который вы опубликовали, много, много не так. Например, если у вас есть только один элемент, зачем вообще использовать массив?

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