kouprianov (kouprianov) wrote,
kouprianov
kouprianov

Categories:

Для тех, кто потерял надежду (экономистам I курса посвящается)

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

10.12.2014
11.12.2014
...
16.12.2014

А мы хотим, чтобы они были записаны так:

2014-12-10
2014-12-11
...
2014-12-16

Исходные данные лежат в файле data.txt. При помощи обычного текстового редактора (у вас стоит Notepad++) мы создаем в той же папке, где лежит файл data.txt файл myscript.pl и пишем в нем таковы слова:

use warnings;
use strict;

open (IN, '<data.txt') or die $!;
open (OUT, '>>data.m.txt') or die $!;
while (<IN>) {
     if ($_ =~ m/^(\d\d)\.(\d\d)\.(\d\d\d\d)/g) {
     print OUT ($3),'-',($2),'-',($1),"\n";
     }
}
close IN;
close OUT;

После этого мы запускаем командную строку, переходим в папку, где лежат файлы data.txt и myscript.pl, и пишем в командной строке

perl myscript.pl

В результате вам снова выводят приглашение командной строки,а в папке появляется файл data.m.txt с таким содержимым:

2014-12-10
2014-12-11
...
2014-12-16

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

use warnings;
   # просите сообщать об ошибках, если найдутся;
use strict;
   # обещаете сначала определять переменные, 
   # а потом только использовать их;

open (IN, '<data.txt') or die $!;
   # Это мы открыли для чтения файл data.txt;
open (OUT, '>>data.m.txt') or die $!;
   # Это мы открыли для записи файл data.m.txt;
while (<IN>) {
   # Начался построчный просмотр файла data.txt;
     if ($_ =~ m/^(\d\d)\.(\d\d)\.(\d\d\d\d)/g) {
      # Если (if) в просматриваемой строке ($_) встречается (=~)
      # последовательность:
      # от начала строки два цифры -- точка -- две цифры -- точка -- четыре цифры, 
      # это и означает на языке регулярных выражений
      # ^(\d\d)\.(\d\d)\.(\d\d\d\d), а m -- оператор поиска 
      # паттерна (от слова match -- совпадать, грубо говоря), 
      # то (1) надо захватить эти цифры в переменные типа $n;
      # в переменные захватываются паттерны в круглых скобках,
      # в $1 -- то, что в первых, в $2 -- то, что во вторых
      # и т. д. скобках;
     print OUT ($3),'-',($2),'-',($1),"\n";
      # и (2) напечатать эти переменные в файл data.m.txt 
      # в обратном порядке, перемежая их дефисами и не забывая 
      # ставить в конце строки знак конца строки (\n);
     }
      # Закрыли цикл if;
}
   # Закрыли цикл while;
close IN;
close OUT; 
   # Закрыли файлы, которые читали и в которые писали;

Вот, собственно, и все. Удачи.

P. S. 2/290/-74/216.



This entry was originally posted at http://kouprianov.dreamwidth.org/299932.html Comment wherever you wish.
Tags: 216, perl, преподавательское
Subscribe

  • Не знаю ответа

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

  • Научного цитирования индекс. Российский

    vigna негодует по поводу того, что «Бюллетень экспериментальной биологии и медицины» в который уже раз печатает всякую…

  • Либерализация ученых степеней: наконец-то...

    Мера, давно назревшая и перезревшая. Полумера (закрыть бы еще и сам ВАК). Она опоздала на десять-пятнадцать лет, не меньше. То же самое давно…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 18 comments

  • Не знаю ответа

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

  • Научного цитирования индекс. Российский

    vigna негодует по поводу того, что «Бюллетень экспериментальной биологии и медицины» в который уже раз печатает всякую…

  • Либерализация ученых степеней: наконец-то...

    Мера, давно назревшая и перезревшая. Полумера (закрыть бы еще и сам ВАК). Она опоздала на десять-пятнадцать лет, не меньше. То же самое давно…