2012-05-09 3 views
0

Это очень ново для меня, но я медленно подбираю его.Perl - использование sed или tail для удаления первой строки файла inline и возврата 1-й строки в var

Мне нужно открыть файл, вернуть первую строку в var, чтобы сделать материал, а затем удалить первую строку из файла после успешного завершения работы.

В сценарии mt, вот что печатает все, кроме первой строки экрана.

$file = 'test.txt'; 

system "tail -n+2 /home/username/public_html/adir/$file"; 

Теперь я сделал некоторые ковыряться здесь и нашел:

system "sed -i '1d' home/username/public_html/adir/$file"; 

который должен удалить первую строку файла инлайн. (Я не пытался)

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

Если материал не удается, я мог бы добавить строку обратно в файл.

Я знаю, что могу сделать это с кучей ФАЙЛА < и> с массивами, но, кажется, немного.

Файл небольшой, менее 100 строк по 6 символов.

Неужели я совершенно не знаю, как преследовать sed или хвост для этого?

Как вернуть удаленную строку в виде строки $, используя эти системные вызовы?

Спасибо за опыт обучения.

+0

Вы хотите использовать perl или хотите сценарий оболочки с помощью sed и tail? пожалуйста, не используйте perl только для вызова системы. – dwalter

+0

Я действительно не знаю. Я попробовал, он вернул результат. Сценарий - это серверный Perl-скрипт, который обновляет информацию о пользователях в таблице mysql от другого. Он будет запущен cron. $ File - это список идентификаторов пользователя, которые необходимо обновить. Идентификатор - это ключ, который запускает синхронизацию базы данных для этого пользователя/строки. –

ответ

1

Похоже на то, что Tie::File идеально подходит.

#!/usr/bin/perl 

use strict; 
use warnings; 
use Tie::File; 

my $file = 'test.txt'; 

tie my @array, 'Tie::File', $file or die "Count not tie file: $file: $!"; 

my $line = $array[0]; 

if (do_something_successfully()) { 
    shift @array; 
} 
+0

Хорошо, после того, как я сменил первый в массиве, я предполагаю, что я использую open (FILE, ">, $ file"); и написать modded @array в успешном, если? –

+0

Нравится: if (do_something_successfully()) { shift @array; открыть FILE, q [>], $ filetoopen; foreach (@array) { print FILE $ _; закрыть (FILE); } –

+0

Nope. Радость Tie :: File заключается в том, что массив _is_ является файлом. Если вы измените массив (например, «сдвиньте свою первую строку»), вы измените файл. Мой код почти завершен. Вам просто нужно написать функцию do_something_successfully. Может быть, вы должны прочитать документацию, связанную с :-) –

3

Мне не нравится идея использовать system() для задач, которые perl блестящий.

Как насчет?

use warnings; 
use strict; 

open my $fh, q[<], $ARGV[0] or die $!; 

## Read from the filehandle in scalar context, so it will read only 
## first line. 
my $first_line = <$fh>; 

# do stuff with first line... 

## And if stuff was successful, read left lines (all but the first one) and 
## print them elsewhere. 
while (<$fh>) { 
    print; 
} 
+0

Это удалит первую строку файла? Где это происходит? Это круто. Извините, действительно новичок в этом и хочу изучить механику. Что-то в инструкции open удаляет первую строку, а затем в конце она записывает/'печатает' файл с удалением первой строки? –

+0

@Jim_Bo: я обновил ответ, чтобы добавить пояснения в комментарии, но да, программа читает из дескриптора файла в скалярном контексте, поэтому только первая строка и последующие чтения будут от второй строки до конца файла. – Birei

+0

Отлично. Я пробовал это, но файл не редактировался. Отображаемые результаты были идеальными. Итак, в то время как я буду печатать $ fh [что]? –

 Смежные вопросы

  • Нет связанных вопросов^_^