Xpoint
   [напомнить пароль]

Открытие пяти файлов, rand и переменные

Метки: [без меток]
[удл]
2007-09-06 16:11:26 [обр] Andrej[досье]

Задача, открыть 5 файлов (1.txt, 2.txt, 3.txt, 4.txt, 5.txt) и в каждом на угад выбрать строчку + записать ее в переменную ($text1, $text2, $text3, $text4, $text5).

Я это делаю так:

open(S, "< $directory/1.txt") or die "Can't open files $!\n";
flock(S,LOCK_SH); # на открытие
my @s =<S>;
close(S) or die "Can't close file $!\n";
my $rands = $s[rand @s];
my ($sname,$smail,$stim,$scity,$text1,$sip) = split(/;/,$rands);

$text1 =~ y/абвгдеёзийклмнопрстуфхъыьэчшщ/abvgdeezijklmnoprstufhjije466/;
$text1 =~ y/АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭЧШЩ/ABVGDEEZIJKLMNOPRSTUFHJIJE466/;
my %mchars = ('ж'=>'zh','ц'=>'ts','ю'=>'ju','я'=>'ja','Ж'=>'Z','Ц'=>'Ts','Ю'=>'Ju','Я'=>'Ja');
for my $c (keys %mchars) {
$text1 =~ s/$c/$mchars{$c}/g;
}

open(S, "< $directory/2.txt") or die "Can't open files $!\n";
flock(S,LOCK_SH); # на открытие
my @s =<S>;
close(S) or die "Can't close file $!\n";
my $rands = $s[rand @s];
my ($sname,$smail,$stim,$scity,$text2,$sip) = split(/;/,$rands);

$text2 =~ y/абвгдеёзийклмнопрстуфхъыьэчшщ/abvgdeezijklmnoprstufhjije466/;
$text2 =~ y/АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭЧШЩ/ABVGDEEZIJKLMNOPRSTUFHJIJE466/;
my %mchars = ('ж'=>'zh','ц'=>'ts','ю'=>'ju','я'=>'ja','Ж'=>'Z','Ц'=>'Ts','Ю'=>'Ju','Я'=>'Ja');
for my $c (keys %mchars) {
$text2 =~ s/$c/$mchars{$c}/g;
}
***

Наверняка есть более разумное и простое решение. Помогите пожалуйста.

спустя 1 час 37 минут [обр] Dennis F. Latypoff aka funky_dennis(24/78)[досье]
#!/usr/bin/perl -W

use warnings;
use strict;
use Fcntl qw(:flock);

my $directory = "./";
my @files = qw(1.txt 2.txt 3.txt 4.txt 5.txt);
my @texts;
my $counter = 0;

my %mchars = ('ж'=>'zh', 'ц'=>'ts', 'ю'=>'ju', 'я'=>'ja', 'Ж'=>'Z', 'Ц'=>'Ts',
              'Ю'=>'Ju', 'Я'=>'Ja');
srand;

foreach my $file (@files) {

    my $line;

    open(S, "< $directory/$file") or die "Can't open file $file: $!\n";
    flock(S, LOCK_SH); # на открытие
    rand($.) < 1 && ($line = $_) while <S>;
    flock(S, LOCK_UN);
    close(S) or die "Can't close file $file: $!\n";

    my $text = (split(/;/, $line))[4];

    $text =~ y/абвгдеёзийклмнопрстуфхъыьэчшщ/abvgdeezijklmnoprstufhjije466/;
    $text =~ y/АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭЧШЩ/ABVGDEEZIJKLMNOPRSTUFHJIJE466/;

    foreach my $c (keys %mchars) {
        $text =~ s/$c/$mchars{$c}/g;
    }

    push @texts, $text;

}
и хоть гиговые файлы подсовывай...
спустя 22 минуты [обр] Andrej[досье]
Хм, а как вы в таком примере предлагаете выводить случайную строчку с определенного файла? Допустим с 3.txt.
спустя 2 минуты [обр] Dennis F. Latypoff aka funky_dennis(24/78)[досье]
Andrej[досье]
$texts[2]
спустя 2 часа 18 минут [обр] Andrej[досье]
Спасибо большое.
спустя 2 часа 45 минут [обр] Алексей В. Иванов(100/2861)[досье]
спустя 13 часов [обр] Andrej[досье]
Dennis, не обрабатываются эти строчки:(
my %mchars = ('&&#230&&'=>'zh', '&&#246&&'=>'ts', '&&#254&&'=>'ju', '&&#255&&'=>'ja', '&&#198&&'=>'Z', '&&#214&&'=>'Ts','&&#222&&'=>'Ju', '&&#223&&'=>'Ja');
спустя 1 час 34 минуты [обр] Dennis F. Latypoff aka funky_dennis(24/78)[досье]
Andrej[досье]
use locale;
спустя 26 минут [обр] Andrej[досье]
не помогает.
спустя 32 минуты [обр] Dennis F. Latypoff aka funky_dennis(24/78)[досье]

какая кодировка используется?

use POSIX qw(:locale_h);
setlocale(LC_ALL, 'ru_RU.UTF-8');

если, не UTF-8, то выставьте другую, например — ru_RU.CP1251 или ru_RU.KOI8-R.

спустя 1 час 3 минуты [обр] Andrej[досье]

Заменил

foreach my $c (keys %mchars) {

на

for my $c (keys %mchars) {

и все заработало. :)

спустя 2 дня [обр] Алексей Севрюков(198/1280)[досье]
Andrej[досье] вообще если в цикле используются и ключи и значения хэша то самый правильный вариант это:
while ( my($k,$v) = each(%mchars) ) {
        $text =~ s/$k/$v/g;
    }
Powered by POEM™ Engine Copyright © 2002-2005