LINUX.ORG.RU

какое-то дичайшее поведение perl-а при передаче за-tie-еного хэша из функции

 may-be-bug, , tie


0

3

принимаются в том числе и ответы «не использовать перл для программы длиннее 20 строчек», но вообще-то хочется узнать:

1. чего я не знаю в перле, раз такая очевидная конструкция у меня глючит

2. как это пофиксить побыстрому (куда-то передать ссылку вместо хэша и т.п.)... не применять же препроцессор, елки-палки?

итак, создадим bdb на 600МБ (это слегка тормозит, но это нормально)

#!/usr/bin/perl -W

use DB_File;

my %result;
tie %result, 'DB_File', 'test.bdb', O_RDWR|O_CREAT, 0666, $DB_BTREE ;

for(my $i=1; $i<12345678; $i++ )
{
  warn( $i ) if $i%100000 eq 0;
  $result{$i} = 12345678 - $i;
}

далее читаем 1 запись из этого файла:

#!/usr/bin/perl -W

use DB_File;
use strict;

sub hash_from_file($)
{
  my ($file) = @_;
  my %result;
  tie %result, 'DB_File', $file, O_RDWR|O_CREAT, 0666, $DB_BTREE ;
  return %result;
}

my %result;

if( exists($ARGV[0]) )
{
  print "hash_from_file\n";
  %result = hash_from_file('test.bdb');
}
else
{                                                            
  # делаем то же, что hash_from_file, только без вызова этой функции
  tie %result, 'DB_File', 'test.bdb', O_RDWR|O_CREAT, 0666, $DB_BTREE ; 
}

print "starting\n";
print $result{'12344321'}."\n";

тут 2 варианта вызова скрипта:

1. если вызвать без аргументов, то читает мгновенно

2. но если вызвать с аргументом, то жрет много памяти (у меня на 32бит дошло до 2ГБ и далее стало свопиться) и цпу 100% одного ядра (причем в меньшем по размеру примере через примерно минуту такого поведения оно таки рожает правильный ответ)

почему, елки-палки?

★★★★★

Последнее исправление: www_linux_org_ru (всего исправлений: 2)

Ответ на: комментарий от reprimand

полноценный ЯП применяют там, где скриптоты не хватает

мне нужна скриптота, но с приличной скоростью и доступом к большим бд на чтение

как вариант можно было бы парсить на перле, загонять в sql сервер, выполнять запрос sql, и генерить по нему html, но там свои неприятности начинаются в связи с тем, что на sql программировать неудобно, и по мелочи, но почти всегда это надо

и запросы мне не особо сложные нужны, и этот процесс загрузил-выполнил-выгрузил как-то кажется излишним

хотя чем больше я смотрю, тем больше склоняюсь все же к этому пути

www_linux_org_ru ★★★★★
() автор топика
Последнее исправление: www_linux_org_ru (всего исправлений: 4)
Ответ на: комментарий от anonymous

Руби не пробовал, например?

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

хотя давно уже хотел спросить, а чем он лучше для мелких скриптов? (50 строк скрипт, 50 в модуле)

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

lib::abs - lib that makes relative path absolute to caller.

local::lib- create and use a local lib/ for perl modules with PERL5LIB.

Мне нравится модуль lib::abs. Вполне годно работает на моих задачах.

Почитай уже perlrun (http://perldoc.perl.org/perlrun.html), сделай выводы.

outtaspace ★★★
()
Ответ на: комментарий от www_linux_org_ru

как сделать стрингификацию на перле?

Переменная a локальная, так что такое можно только макросом сделать. Смотри модули макросов.

annulen ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

а так есть String::Interpolate и старый добрый eval в совсем простых случаях

annulen ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

а чем он лучше для мелких скриптов?

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.