Thread View: pl.comp.lang.perl
31 messages
31 total messages
Started by Przemyslaw Popielarski
Sun, 10 May 1998 18:47
Nietypowy Search Engine
Author: Przemyslaw Popielarski
Date: Sun, 10 May 1998 18:47
Date: Sun, 10 May 1998 18:47
28 lines
1642 bytes
1642 bytes
Mam pytanie o dosyc chyba nietypowy search engine dostepny przez CGI. Powinien on przeszukiwac tylko JEDEN plik (ktory jest tekstowa baza danych w formacie CSV) i jako rezultat wypluwac wszystkie linijki z tego pliku spelniajace kryteria. Nie jest to cos trudnego to zrobienia, albowiem sam to zrobilem, choc na perlu nie znam sie prawie wcale. I wlasnie dlatego, ze sie nie znam, to wiem, ze na pewno kod przeze mnie stworzony jest zupelnie nie zaoptymalizowany pod wzgledem szybkosci. A mnie wlasnie zalezy na szybkosci i na jak najmniejszym obciazeniu servera (plik przeszukiwany ma ponad ok. 3 MB). Dlatego prosze Was o podpowiedz, czy tego rodzaju searche sa dostepne na necie ? Kopalem ostatnio mocno i natrafilem np. na ciekawy Xavatoria Indexed Search Engine; Matt's Search Engine; Intermediate Search itp. Wszystkie te searche opieraja sie jednak na przeszukiwaniu wielu stron i wypluwaniu linkow do nich. Pomozecie ? ./ premax ./ abe@ikp.pl, premax@abe.com.pl ./ uin 9022511 ./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Ziemek Borowski
Date: Mon, 11 May 1998 07:55
Date: Mon, 11 May 1998 07:55
11 lines
1175 bytes
1175 bytes
Przemyslaw Popielarski na pl.comp.lang.perl napisał:
>Mam pytanie o dosyc chyba nietypowy search engine dostepny przez CGI.
>
>Powinien on przeszukiwac tylko JEDEN plik (ktory jest tekstowa baza danych w
>formacie CSV) i jako rezultat wypluwac wszystkie linijki z tego pliku
>spelniajace kryteria.
grep?
--
Ziemek Borowski http://faq-bot.ZiemBor.Waw.pl/ZMB/
http://faq-bot.ZiemBor.Waw.pl/pl.comp.www/
Re: Nietypowy Search Engine
Author: Jacek Kubica
Date: Mon, 11 May 1998 09:22
Date: Mon, 11 May 1998 09:22
24 lines
1134 bytes
1134 bytes
Przemyslaw Popielarski wrote:
> Mam pytanie o dosyc chyba nietypowy search engine dostepny przez CGI.
najprosciej tak :
szukasz $query w zbiorze $data_file;
open(DATAFILE,"$data_file");
while(<DATAFILE>)
{
if (/$query/i){
print;
}
}
close(DATAFILE);
..ale czy najszybciej ?? :)
--
= _//_ = mailto:kubica@ch.wssk.wroc.pl =
http://zdo.wssk.am.wroc.pl/~kubica/ =
= // = Jacek Kubica = SurGeoN = Webmaster of Regional Specialistic
Hospital in Wroclaw =
Re: Nietypowy Search Engine
Author: A.B.E. Marketing
Date: Mon, 11 May 1998 14:52
Date: Mon, 11 May 1998 14:52
14 lines
1069 bytes
1069 bytes
Jacek Kubica napisał(a) w wiadomości: >najprosciej tak : >szukasz $query w zbiorze $data_file; ja mam zrobione tak, ze wczytuje caly plik (3MB) jako tablice (jeden wiersz, jeden rekord) i potem tylko tablice przeszukuje. Ale czy to jest dopuszczalne rezerwowanie tak duzej ilosci pamieci ? ./ premax ./ abe@ikp.pl, premax@abe.com.pl ./ uin 9022511 ./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Piotr Piatkowski
Date: Mon, 11 May 1998 20:05
Date: Mon, 11 May 1998 20:05
25 lines
1788 bytes
1788 bytes
Przemyslaw Popielarski <abe@ikp.pl> wrote:
: Mam pytanie o dosyc chyba nietypowy search engine dostepny przez CGI.
: Powinien on przeszukiwac tylko JEDEN plik (ktory jest tekstowa baza danych w
: formacie CSV) i jako rezultat wypluwac wszystkie linijki z tego pliku
: spelniajace kryteria.
Trochę za mało danych jak dla mnie. Istotne jest co to jest ten
format CSV (może wszyscy wiedzą, ale ja nie), i jakie te kryteria
mają spełniać "wypluwane" linijki.
Tak czy inaczej rozwiązanie optymalne powinno moim zdaniem trzymać
sobie jakiś indeks do tego pliku, aktualizowany przy każdej zmianie
pliku. Pytanie tylko co ten plik ma zawierać. Jeżeli chodzi np. o
wyszukiwanie słów, do pliku należałoby wstawić wszystkie występujące
w pliku słow, wraz z pozycjami na których występują.
Napisz może coś więcej - co to za plik (co go generuje - bo może
najlepiej od razu zapisywać te dane w innym formacie?), i jakie są
kryteria wyszukiwania.
--
Piotr Piątkowski, Uczelniane Centrum Informatyki, AGH Krakow, POLAND
=== I nie używaj exec() tylko system() ===
Re: Nietypowy Search Engine
Author: Przemyslaw Popielarski
Date: Tue, 12 May 1998 12:08
Date: Tue, 12 May 1998 12:08
36 lines
1854 bytes
1854 bytes
Piotr Piatkowski napisał(a) w wiadomości: >Napisz może coś więcej - co to za plik (co go generuje - bo może >najlepiej od razu zapisywać te dane w innym formacie?), i jakie są >kryteria wyszukiwania. Plik jest generowany przez DOSowy program do obslugi ksiegarni. Wyglada on mniej wiecej tak: tytul_ksiazki_blahbla;autor_bleble;wydawnictwo;cena;ilosc_jaka_jest_na_Stani e Perl;jakis autor;jakies wydawnictwo;jakas cena;ilosc_jakas tytul_ksiazki_blahbla;autor_bleble;wydawnictwo;cena;ilosc_jaka_jest_na_Stani e i takich linijek jest 34 tysiace. Jak widac pola sa przedzielone srednikami. Stala ilosc pol w wierszu. Skrypt po wpisaniu np. perl powinien wypluc wszystkie linijki, ktore zawieraja slowo perl. Oczywiscie dorobilbym jakies formatowanie do tego, tak by skrypt rozpoznawal poszczegolne pola i zebym np mogl sformatowac wynik: tj. np autora umiescic w jednej linijce, a tytul w drugiej. Moge oczywiscie przekonwertowac ten rodzaj pliku do jakiegos innego, ale po co ? Chyba taka struktura jest dosyc prosta ? Pozdrawiam, ./ premax ./ abe@ikp.pl, premax@abe.com.pl ./ uin 9022511 ./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Pawel Gajda
Date: Tue, 12 May 1998 12:44
Date: Tue, 12 May 1998 12:44
18 lines
1338 bytes
1338 bytes
Przemyslaw Popielarski wrote: [..] > Plik jest generowany przez DOSowy program do obslugi ksiegarni. > Wyglada on mniej wiecej tak: > > tytul_ksiazki_blahbla;autor_bleble;wydawnictwo;cena;ilosc_jaka_jest_na_Stani > e > Perl;jakis autor;jakies wydawnictwo;jakas cena;ilosc_jakas > tytul_ksiazki_blahbla;autor_bleble;wydawnictwo;cena;ilosc_jaka_jest_na_Stani > e > > i takich linijek jest 34 tysiace. > Jak widac pola sa przedzielone srednikami. Stala ilosc pol w wierszu. Jednym z możliwych rozwiązań jest wrzucenie tego do dbmsa (np. mySQL). Nie bawisz się wtedy w pisanie wyszukiwania, robi to za Ciebie dbms. Paweł
Re: Nietypowy Search Engine
Author: Qrczak
Date: Tue, 12 May 1998 15:42
Date: Tue, 12 May 1998 15:42
26 lines
1901 bytes
1901 bytes
On Mon, 11 May 1998, A.B.E. Marketing wrote:
> ja mam zrobione tak, ze wczytuje caly plik (3MB) jako tablice (jeden wiersz,
> jeden rekord) i potem tylko tablice przeszukuje.
> Ale czy to jest dopuszczalne rezerwowanie tak duzej ilosci pamieci ?
Formalnie tak - cytat z man perl:
Unlike most Unix utilities, Perl does
not arbitrarily limit the size of your data--if you've got
the memory, Perl can slurp in your whole file as a single
string. Recursion is of unlimited depth. And the tables
used by hashes (previously called "associative arrays")
grow as necessary to prevent degraded performance. Perl
uses sophisticated pattern matching techniques to scan
large amounts of data very quickly.
Ale oczywiście jeśli nie ma takiej potrzeby, to lepiej nie marnować
tyle pamięci. Np. jeśli to, co robimy z plikiem, można zroibić linijka
po linijce, to nie ma sensu ładować go całego do pamięci.
--
QRCZAK
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrczak.home.ml.org/
Re: Nietypowy Search Engine
Author: Qrczak
Date: Tue, 12 May 1998 15:57
Date: Tue, 12 May 1998 15:57
39 lines
2056 bytes
2056 bytes
On Tue, 12 May 1998, Przemyslaw Popielarski wrote:
> tytul_ksiazki_blahbla;autor_bleble;wydawnictwo;cena;ilosc_jaka_jest_na_Stanie
> Perl;jakis autor;jakies wydawnictwo;jakas cena;ilosc_jakas
> tytul_ksiazki_blahbla;autor_bleble;wydawnictwo;cena;ilosc_jaka_jest_na_Stanie
IMHO bardzo wygodny format.
> Skrypt po wpisaniu np. perl powinien wypluc wszystkie linijki, ktore
> zawieraja slowo perl.
Najprostszy skrypt, który to zrobi:
/perl/i and print while <>
> Oczywiscie dorobilbym jakies formatowanie do tego, tak by skrypt
> rozpoznawal poszczegolne pola i zebym np mogl sformatowac wynik: tj.
> np autora umiescic w jednej linijce, a tytul w drugiej.
Nic prostszego. Na przykład tak można szukać tylko w pierwszej rubryce,
wypisując przy tym pola znalezionych pozycji w osobnych liniach:
while (<>)
{
@F = split ";";
print join ("\n", @F), "\n" if $F[0] =~ /perl/i;
}
Gorąco zachęcam do przeczytania dokumentacji (np. linuksowego mana).
Tam wszystko jest opisane!
Tylko to obudować, żeby czytał z odpowiedniego pliku, wyszukiwał co mu
się poda, pisał nagłówki http, ubrał to w jakiś HTML...
--
QRCZAK
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrczak.home.ml.org/
Re: Nietypowy Search Engine
Author: Przemyslaw Popielarski
Date: Tue, 12 May 1998 20:23
Date: Tue, 12 May 1998 20:23
361 lines
11068 bytes
11068 bytes
Qrczak napisał(a) w wiadomości: ...
>IMHO bardzo wygodny format.
Tez tak sadze :)
>Gorąco zachęcam do przeczytania dokumentacji (np. linuksowego >mana).
Nie omieszkam. narazie przestudiowalem wnikliwie pare polskich manuali
dostepnych w sieci.
>Tylko to obudować, żeby czytał z odpowiedniego pliku, wyszukiwał co mu
>się poda, pisał nagłówki http, ubrał to w jakiś HTML...
Nie wiem, czy nie bede zbyt nachalny zamieszczajac tutaj co stworzylem (hmm
sklecilem :)) - ale w chwili czasu moze zobaczycie na oko, czy ten skrypt
jest bardzo wolny, czy tylko troche; czy jest bardzo zle napisany czy po
prostu zle itp..
Staralem sie unikac zmiennej $_, bo chociaz wydaje mi sie, ze juz ja
pojalem, to ciagle jeszcze sie nie oswoilem...
Aha, dodam jeszcze, ze znalazlem gdzies biblioteke cgi-lib od obslugi danych
z formularza, wiec ja wykorzystalem...
moj_skr.cgi
--------
#!/usr/bin/perl
# Plik z danymi
$pliklog = "~premax/public_html/abedata.csv";
# Deklaracja biblioteki cgi-lib.pl
require "cgi-lib.pl";
# wywolanie funkcji z cgi-lib.pl do dekodowania danych z formularza
&ReadParse (*cgi_input);
# Wypisanie na wyjscie kodu HTML, czyli strony WWW
print &PrintHeader;
print <<HTML_kod;
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<META http-equiv="content-type" content="text/html; charset=ISO-8859-2">
<title>Wyniki wyszukiwania</title>
</head>
<body background="~premax/public_html/img_back.gif" link="#FFFF00"
vlink="#C0C0C0" alink="#0000FF">
<font size="1" face="helvetica">
HTML_kod
# Odczyt danych z pliku
# otwarcie pliku do odczytu
open (PLIK, "$pliklog") || die "Nie moge otworzyc pliku: $pliklog\n";
@tekst = <PLIK>; # zapisanie tekstu z pliku w tablicy (kaľda
# linia b?dzie jednym elementem tablicy @tekst)
close (PLIK); # zamkni?cie pliku
#$_=$cgi_input{'txt'}; # Przypisanie zmiennej zawawrtosci pola 'txt'
# formularza do zmiennej specjalnej '$_'
$cgi_input{'txt'} = tr/A-Z/a-z/; # Zamiana duzych liter na male w zmiennej
$_
#$cgi_input_maly=$_; # Przypisanie nowej wartosci do nowej zmiennej
$counter=0; # Licznik wypisan rekordow na strone, jezeli
# przekroczy 50, przestaniemy wypisywac dane
foreach $rekord (@tekst) # Kaľdy kolejny element tablicy @tekst
# b?dzie chwilowo dost?pny pod zmiennĄ
$rekord
{
$_=$rekord; # Przypisanie zmiennej $rekord do zmiennej
# specjalnej $_
tr/A-Z/a-z/; # Zamiana wszystkich liter duzych na male w
# domyslnej zmiennej $_
$rekord_maly=$_; # Zwalniamy zmienna specjalna, przypisujac
jej
# wartosc do nowej zmiennej
if ($rekord_maly =~ /$cgi_input_maly/) # Jesli wartosc zmiennej
# $cgi_input_maly zawiera sie w
# zmiennej $rekord_maly...
{
$_=$rekord; # Przypisanie zmiennej $rekord do zmiennej
# specjalnej $_
# W linijce ponizej zamieniamy szukane wyrazenie
# (zawarte w zmiennej $cgi_input{'txt'} na ten sam ciag, ale poprzedzony i
# zakonczony znacznikiem <FONT>. W ten sposob zmieniamy kolor wyszukiwanego
# wyrazenia.
if ($cgi_input{'txt'} ne "")
{
s/$cgi_input{'txt'}/<font color="#0000FF">$cgi_input{'txt'}<\/font>/g;
# s/$cgi_input_maly/<font color="#0000FF">$cgi_input_maly<\/font>/g;
}
s/&/&/gi; # A tutaj zmieniamy kazdy znak '&' (ktory jest znakiem
# specjalnym w HTML na jego HTML-owy odpowiednik - '&'.
$rekord=$_; # I zwalniamy zmienna specjalna $_.
$counter++; # Zwiekszenie licznika wypisan o 1
if ($counter < 31)
{
print "$rekord<BR>\n"; # Wypisanie calego rekordu, zawierajacego szukane
# wyrazenie.
}
if ($counter == 30)
{
print "<BR><B><font size=\"2\">ZNALEZIONO PONAD 30 REKORDOW, PROSZE
BARDZIEJ SZCZEGOLOWO OKRESLIC PYTANIE.</font></b><BR>\n"; # Wypisanie
calego rekordu, zawierajacego szukane
# wyrazenie.
}
} ## endif
} # end foreach
print <<HTML_kod; # Wypisanie na wyjscie kodu HTML, konczacego strone.
</font>
<hr>
</body>
</html>
HTML_kod
----------------------- koniec moj_skr.cgi------
Wspomniana bliblioteka cgi-lib przedstawia sie nastepujaco (wlasciwie chyba
tylko pierwsza funkcja jest wykorzystywana):
--------- cgi-lib.pl -----------
#!/usr/bin/perl -- -*- C -*-
# programy/perl/perl -- -*- C -*-
# Perl Routines to Manipulate CGI input
# S.E.Brenner@bioc.cam.ac.uk
# $Header: /cys/people/brenner/http/cgi-bin/RCS/cgi-lib.pl,v 1.8 1995/04/07
21:35:29 brenner Exp $
#
# Copyright 1994 Steven E. Brenner
# Unpublished work.
# Permission granted to use and modify this library so long as the
# copyright above is maintained, modifications are documented, and
# credit is given for any use of the library.
#
# Thanks are due to many people for reporting bugs and suggestions
# especially Meng Weng Wong, Maki Watanabe, Bo Frese Rasmussen,
# Andrew Dalke, Mark-Jason Dominus and Dave Dittrich.
# For more information, see:
# http://www.bio.cam.ac.uk/web/form.html
# http://www.seas.upenn.edu/~mengwong/forms/
# Minimalist http form and script
(http://www.bio.cam.ac.uk/web/minimal.cgi):
#
# require "cgi-lib.pl";
# if (&ReadParse(*input)) {
# print &PrintHeader, &PrintVariables(%input);
# } else {
# print &PrintHeader,'<form><input type="submit">Data: <input
name="myfield">';
#}
# ReadParse
# Reads in GET or POST data, converts it to unescaped text, and puts
# one key=value in each member of the list "@in"
# Also creates key/value pairs in %in, using '\0' to separate multiple
# selections
# Returns TRUE if there was input, FALSE if there was no input
# UNDEF may be used in the future to indicate some failure.
# Now that cgi scripts can be put in the normal file space, it is useful
# to combine both the form and the script in one place. If no parameters
# are given (i.e., ReadParse returns FALSE), then a form could be output.
# If a variable-glob parameter (e.g., *cgi_input) is passed to ReadParse,
# information is stored there, rather than in $in, @in, and %in.
sub ReadParse {
local (*in) = @_ if @_;
local ($i, $key, $val);
# Read in text
if (&MethGet) {
$in = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
}
@in = split(/&/,$in);
foreach $i (0 .. $#in) {
# Convert plus's to spaces
$in[$i] =~ s/\+/ /g;
# Split into key and value.
($key, $val) = split(/=/,$in[$i],2); # splits on the first =.
# Convert %XX from hex numbers to alphanumeric
$key =~ s/%(..)/pack("c",hex($1))/ge;
$val =~ s/%(..)/pack("c",hex($1))/ge;
# Associate key and value
$in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple
separator
$in{$key} .= $val;
}
return length($in);
}
# PrintHeader
# Returns the magic line which tells WWW that we're an HTML document
sub PrintHeader {
return "Content-type: text/html\n\n";
}
# MethGet
# Return true if this cgi call was using the GET request, false otherwise
sub MethGet {
return ($ENV{'REQUEST_METHOD'} eq "GET");
}
# MyURL
# Returns a URL to the script
sub MyURL {
return 'http://' . $ENV{'SERVER_NAME'} . $ENV{'SCRIPT_NAME'};
}
# CgiError
# Prints out an error message which which containes appropriate headers,
# markup, etcetera.
# Parameters:
# If no parameters, gives a generic error message
# Otherwise, the first parameter will be the title and the rest will
# be given as different paragraphs of the body
sub CgiError {
local (@msg) = @_;
local ($i,$name);
if (!@msg) {
$name = &MyURL;
@msg = ("Error: script $name encountered fatal error");
};
print &PrintHeader;
print "<html><head><title>$msg[0]</title></head>\n";
print "<body><h1>$msg[0]</h1>\n";
foreach $i (1 .. $#msg) {
print "<p>$msg[$i]</p>\n";
}
print "</body></html>\n";
}
# PrintVariables
# Nicely formats variables in an associative array passed as a parameter
# And returns the HTML string.
sub PrintVariables {
local (%in) = @_;
local ($old, $out, $output);
$old = $*; $* =1;
$output .= "<DL COMPACT>";
foreach $key (sort keys(%in)) {
foreach (split("\0", $in{$key})) {
($out = $_) =~ s/\n/<BR>/g;
$output .= "<DT><B>$key</B><DD><I>$out</I><BR>";
}
}
$output .= "</DL>";
$* = $old;
return $output;
}
# PrintVariablesShort
# Nicely formats variables in an associative array passed as a parameter
# Using one line per pair (unless value is multiline)
# And returns the HTML string.
sub PrintVariablesShort {
local (%in) = @_;
local ($old, $out, $output);
$old = $*; $* =1;
foreach $key (sort keys(%in)) {
foreach (split("\0", $in{$key})) {
($out = $_) =~ s/\n/<BR>/g;
$output .= "<B>$key</B> is <I>$out</I><BR>";
}
}
$* = $old;
return $output;
}
1; #return true
-------------- koniec cgi_lib ----------
Eh, duzo tego wyszlo. Sorki za to.
Wlasciwie to ten skypt chodzi o robi to co chce. Ale:
1) Nie wiem czy to jest szybkie
2) Nie umiem zrobic wyrozniania szukanych slow w zwroconym wyniku.
Tzn np jak szukam 'perl', to nie umiem zrobic, zeby mi program zwrocil cos
takiego:
Tytul: Ucze sie chetnie ***Perl***a dla unixa, ale rownie chetnie pisze cos
w ***Perl***u dla windowsa. Wlasciwie zrobilem cos takiego, ale mi nie do
konca wyszlo. Tzn moj skrypt podswietla *szukany* ciag, a ja tego nie chce.
Bowiem *szukany* ciag nie zawsze jest rowny *znalezionemu*. Np: (uwaga na
case-sensitive!):
Gosciu w polu SZUKAJ wpisuje: pErL
A ja mam w bazie napis Perl. W tym momencie moj skrypt napisze:
'Znaleziono tytul: Chetnie ucze sie ***pErL***a.'
Zamiast: 'Znaleziono tytul: Chetnie ucze sie ***Perl***a.'
Strasznie zamacilem. Okrutnie. Ale moj problem jest troche zlozony...
Jak nic z tego nie rozumiecie, to napiszcie. Postaram sie wyjasnic jeszcze
raz.
Pozdrawiam,
./ premax
./ abe@ikp.pl, premax@abe.com.pl
./ uin 9022511
./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Przemyslaw Popielarski
Date: Tue, 12 May 1998 20:27
Date: Tue, 12 May 1998 20:27
21 lines
1515 bytes
1515 bytes
Qrczak napisał(a) w wiadomości: ... >Formalnie tak - cytat z man perl: [...] >Ale oczywiście jeśli nie ma takiej potrzeby, to lepiej nie marnować >tyle pamięci. Np. jeśli to, co robimy z plikiem, można zroibić linijka >po linijce, to nie ma sensu ładować go całego do pamięci. Aha, ale, czy jesli bede linijka po linijce wczytywal i po kazdym wczytaniu jednej linijki bede ja przeszukiwal w celu znalezienia okreslonego wyrazenia, to czy nie bedzie to dluuuugo trwalo ? Czy nie bedzie szybciej, gdy wczytam caly plik naraz ? A jesli bedzie szybciej to na tyle duzo, zeby sie oplacalo marnowac tyle pamieci ? ./ premax ./ abe@ikp.pl, premax@abe.com.pl ./ uin 9022511 ./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Przemyslaw Popielarski
Date: Tue, 12 May 1998 20:29
Date: Tue, 12 May 1998 20:29
14 lines
1302 bytes
1302 bytes
Pawel Gajda napisał(a) w wiadomości: >Jednym z możliwych rozwiązań jest wrzucenie tego do dbmsa (np. mySQL). >Nie bawisz się wtedy w pisanie wyszukiwania, robi to za Ciebie dbms. Nie mam i nie bede mial dostepnego mySQL-a na serverze. Opcjonalnie jest chyba miniSQL (nie wiem czy i ile to sie rozni), ale nie chce z tego korzystac. Jak pisal Qrczak, format przeze mnie przedstawiony jest bardzo wygodny. Ja chce (musze) koniecznie uzyc Perla! ./ premax ./ abe@ikp.pl, premax@abe.com.pl ./ uin 9022511 ./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Jacek Kubica
Date: Wed, 13 May 1998 09:49
Date: Wed, 13 May 1998 09:49
51 lines
2338 bytes
2338 bytes
Przemyslaw Popielarski wrote: (... ciach...) > Wlasciwie to ten skypt chodzi o robi to co chce. Ale: > 1) Nie wiem czy to jest szybkie To sprawdz doswiadczalnie ! :) > 2) Nie umiem zrobic wyrozniania szukanych slow w zwroconym wyniku. mozna tak:(algorytm) Zalozenie: szukasz $query w linii $line 1.obliczasz długosc $query $dlugosc = length($query); 2.zapamietujesz $line w $temp $temp = $line; 3.zamieniasz wszystkie litery w $query i $temp na male $query =~ y/[A-Z]/[a-z]/; $temp =~ y/[A-Z]/[a-z]/; 4. odnajdujesz poczatek $query w $temp $pocz = index($temp,$query); 5. Teraz wycinasz $wyraz ktory jest "odpowiednio" napisanym $query $wyraz = substr($line,$pocz,$dlugosc); 6. zamieniasz w $line wszystkie wystapienia $wyraz na <b>$wyraz</b> $line =~ s/$wyraz/<b>$wyraz<\/b>/g; print $line; Przyklad (ktory dziala!) #!/usr/local/bin/perl $query = "pErL"; $line = "Chetnie ucze sie Perla, bo lubie Perla"; $temp = $line; $query =~ y/[A-Z]/[a-z]/; $temp =~ y/[A-Z]/[a-z]/; $pocz = index($temp,$query); $dlugosc = length($query); $wyraz = substr($line,$pocz,$dlugosc); $line =~ s/$query/<b>$wyraz<\/b>/gi; print $line; ========================================= Wynik : "Chetnie ucze sie <b>Perl</b>a , bo lubie "<b>Perl</b>a Chyba o to Ci chodzilo ? Jacek = mailto:kubica@ch.wssk.wroc.pl = http://zdo.wssk.am.wroc.pl/~kubica/ = = Jacek Kubica M.D = SurGeoN = = Webmaster of Regional Specialistic Hospital in Wroclaw =
Re: Nietypowy Search Engine
Author: Przemyslaw Popielarski
Date: Wed, 13 May 1998 18:58
Date: Wed, 13 May 1998 18:58
25 lines
1663 bytes
1663 bytes
Jacek Kubica napisał(a) w wiadomości: >> Wlasciwie to ten skypt chodzi o robi to co chce. Ale: >> 1) Nie wiem czy to jest szybkie >To sprawdz doswiadczalnie ! :) Zle sie wyrazilem. Oczywiscie, ze sprawdzam to doswiadczalnie. I wiem, ze to takie szybkie nie jest :) Ale chodzi mi oto, czy moze byc szybsze i o ile... Przede wszystkim interesuje mnie, o ile spowalnia niewczytanie calego pliku do pamieci i szukanie ciagow znakow po kolei wczytujac linijki, zamiast najpierw caly plik wczytac i szukac w tablicy. >Chyba o to Ci chodzilo ? Dokladnie. W sumie prosto to wyszlo - a ja sie tyle meczylem :) Nie chcialem tworzyc bowiem tylu nowych zmiennych, widac zle sie do tego zabralem. Dzieki. ./ premax ./ abe@ikp.pl, premax@abe.com.pl ./ uin 9022511 ./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Piotr Piatkowski
Date: Wed, 13 May 1998 21:56
Date: Wed, 13 May 1998 21:56
29 lines
2267 bytes
2267 bytes
Przemyslaw Popielarski <abe@ikp.pl> wrote: : Aha, : ale, czy jesli bede linijka po linijce wczytywal i po kazdym wczytaniu : jednej linijki bede ja przeszukiwal w celu znalezienia okreslonego : wyrazenia, to czy nie bedzie to dluuuugo trwalo ? : Czy nie bedzie szybciej, gdy wczytam caly plik naraz ? A jesli bedzie : szybciej to na tyle duzo, zeby sie oplacalo marnowac tyle pamieci ? Nie wydaje mi sie zeby byla duza roznica miedzy jedna i druga metoda. Czytajac po linijce czytaz w koncu caly plik, a czytajac caly plik tez czytasz kazda linijke. Roznice raczej beda minimalne. Jezeli chodzi o metody szybsze, to mozna np. stworzyc tablice asocjacyjna (zwana takze hashem), mozna do tego uzyc np. biblioteki gdbm. W takiej tablicy nalezaloby zapisac wszystkie wyrazy wystepujace w pliku z zaznaczeniem do ktorej linijki naleza (a wlasciwie - od ktorego bajtu pliku zaczyna sie linijka w ktorej dane slowo wystepuje). W takim wypadku wyszukanie dowolnego slowa byloby mozliwe w takim samym czasie - bez wzgledu na wielkosc pliku. Ale oczywiscie nic za darmo - trzeba by wczesniej przygotowac taka tablice (indeks) i aktualizowac ja przy kazdej zmianie pliku. Jezeli przeszukiwanie liniowe jest zbyt wolne, i chcesz to zrobic w bardziej optymalny (ale i znacznie bardziej skomplikowany) sposob, to moge napisac cos wiecej... -- Piotr Piątkowski, Uczelniane Centrum Informatyki, AGH Krakow, POLAND
Re: Nietypowy Search Engine
Author: Qrczak
Date: Thu, 14 May 1998 07:27
Date: Thu, 14 May 1998 07:27
99 lines
4600 bytes
4600 bytes
On Tue, 12 May 1998, Przemyslaw Popielarski wrote:
> Aha, dodam jeszcze, ze znalazlem gdzies biblioteke cgi-lib od obslugi
> danych z formularza, wiec ja wykorzystalem...
Ja z kolei jej nie znam, więc nie ocenię tego, co z nią związane.
> # Plik z danymi
> $pliklog = "~premax/public_html/abedata.csv";
To szel rozwija ~ w nazwie pliku, a nie system, więc to nie zadziała.
Gdyby to był katalog domowy bieżącego użytkownika, toby można go zapisać
przez $ENV{HOME}, a tak to chyba najprościej wpisać na stałe
/home/premax czy jak tam...
> open (PLIK, "$pliklog") || die "Nie moge otworzyc pliku: $pliklog\n";
Wydaje mi się, że zamiast die lepiej to wypisać w tym HTMLu, prawda?
> #$_=$cgi_input{'txt'}; # Przypisanie zmiennej zawawrtosci pola 'txt'
> # formularza do zmiennej specjalnej '$_'
>
> $cgi_input{'txt'} = tr/A-Z/a-z/; # Zamiana duzych liter na male w zmiennej
> $_
>
> #$cgi_input_maly=$_; # Przypisanie nowej wartosci do nowej zmiennej
Prościej tak:
($cgi_input_maly = $cgi_input{txt}) =~ tr/A-Z/a-z;
(operatorem =~ pozwala przeszukiwać albo zamieniać nie tylko $_)
albo tak:
$cgi_input_maly = lc $cgi_input{txt};
albo zgoła nie konwertować na małe litery ręcznie, tylko dodać flagę /i
przy wyszukiwaniu (ignore case).
> foreach $rekord (@tekst) # Kaudy kolejny element tablicy @tekst
> # b?dzie chwilowo dost?pny pod zmiennĄ
IMHO prościej czytać tutaj na bieżąco z pliku. Dodatkowo nie będziemy
czytać całego pliku, jeśli będzie tego więcej niż 30.
> if ($rekord_maly =~ /$cgi_input_maly/) # Jesli wartosc zmiennej
> # $cgi_input_maly zawiera sie w
> # zmiennej $rekord_maly...
> {
Akurat na rekord użyłbym bezpośrednio zmiennej $_. Tak więc:
$szukamy = $cgi_input{txt};
while (<PLIK>)
{
if (/$szukamy/io)
{
Flaga /o jest tutaj _bardzo_ przydatna - powoduje, że wyrażenie
regularne będzie skompilowane tylko raz, a nie przy każdym użyciu, co
powinno znacząco przyspieszyć. Flaga ta jest sensowna tylko jeśli
wyrażenie regularne formalnie nie jest stałe, ale skądinąd wiemy, że
wszystkie zmienne tam użyte się nie zmienią - tak jak tutaj.
Bo oczywiście jest to perlowe wyrażenie regularne, a nie kawałek tekstu.
Użytkownik powinien to wiedzieć. Jeśli miałby być wyszukany tylko
kawałek tekstu, to można by go zapisać tak: /\Q$szukane/io (zobacz
linuksowy man perlre). Z tym że część osób potrafi z wyrażeń regularnych
skorzystać, więc głupio by było taką możliwość niepotrzebnie zabierać.
Za to trzeba by się jakoś zabezpieczyć przez błędami składni w takim
wyrażeniu, bo skrypt się posypie. Chyba można wstępnie przetestować
to wyrażenie regularne wewnątrz eval, co pozwoli złapać błędy jego
składni podczas wykonania, nie przerywając działania skryptu
(man perlfunc).
> s/$cgi_input{'txt'}/<font color="#0000FF">$cgi_input{'txt'}<\/font>/g;
Lepiej tak: s/$szukamy/<font color="#0000FF">$&<\/font>/gio
albo: s|$szukamy|<font color="#0000FF">$&</font>|gio
Można to zresztą połączyć z wyszukiwaniem, jako że s///g zwraca ilość
dokonanych zamian (man perlop, man perlvar).
> s/&/&/gi; # A tutaj zmieniamy kazdy znak '&' (ktory jest znakiem
> # specjalnym w HTML na jego HTML-owy odpowiednik - '&'.
Tym razem /i nie ma znaczenia.
Jeszcze s/</</g i s/>/>/g (_po_ s/&/&/g).
> Ale moj problem jest troche zlozony...
IMHO nie jest :-)
--
QRCZAK
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrczak.home.ml.org/
Re: Nietypowy Search Engine
Author: Qrczak
Date: Thu, 14 May 1998 07:37
Date: Thu, 14 May 1998 07:37
13 lines
1308 bytes
1308 bytes
On Tue, 12 May 1998, Przemyslaw Popielarski wrote:
> ale, czy jesli bede linijka po linijce wczytywal i po kazdym wczytaniu
> jednej linijki bede ja przeszukiwal w celu znalezienia okreslonego
> wyrazenia, to czy nie bedzie to dluuuugo trwalo ?
Nie sądzę, ale po prostu sprawdź!
--
QRCZAK
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrczak.home.ml.org/
Re: Nietypowy Search Engine
Author: Jacek Kubica
Date: Thu, 14 May 1998 09:08
Date: Thu, 14 May 1998 09:08
32 lines
2166 bytes
2166 bytes
Przemyslaw Popielarski wrote: > >To sprawdz doswiadczalnie ! :) > Zle sie wyrazilem. Oczywiscie, ze sprawdzam to doswiadczalnie. I wiem, ze to > takie szybkie nie jest :) > Ale chodzi mi oto, czy moze byc szybsze i o ile... > Przede wszystkim interesuje mnie, o ile spowalnia niewczytanie calego pliku > do pamieci i szukanie ciagow znakow po kolei wczytujac linijki, zamiast > najpierw caly plik wczytac i szukac w tablicy. No to chyba jasne ze przeszukiwanie zbioru linia po linii z dysku jest relatywnie wolniejsze niz search tablicy w pamieci komputera. To tez oczywiscie zalezy od serwera na ktorym takie poszukiwania wykonujesz (kwestie hardwarowe) Dalej aktualna jest sugestia o doswiadczalne sprawdzenie , ewentualnie pogadanie z adminem na ten temat. > >Chyba o to Ci chodzilo ? > Dokladnie. W sumie prosto to wyszlo - a ja sie tyle meczylem :) > Nie chcialem tworzyc bowiem tylu nowych zmiennych, widac zle sie do tego > zabralem. Czasem to proste jest najtrudniejsze :). A zmienne "dodatkowe" sa tylko 3. -- = _//_ = mailto:kubica@ch.wssk.wroc.pl = http://zdo.wssk.am.wroc.pl/~kubica/ = = // = Jacek Kubica = SurGeoN = Webmaster of Regional Specialistic Hospital in Wroclaw =
Re: Nietypowy Search Engine
Author: Qrczak
Date: Thu, 14 May 1998 09:12
Date: Thu, 14 May 1998 09:12
15 lines
1601 bytes
1601 bytes
On Thu, 14 May 1998, Jacek Kubica wrote:
> No to chyba jasne ze przeszukiwanie zbioru linia po linii z dysku jest
> relatywnie wolniejsze niz search tablicy w pamieci komputera.
Przecież żeby przeszukać w pamięci komputera, to trzeba najpierw to
z dysku załadować! IMHO w sumie różnica będzie minimalna, i nie jest
powiedziane, w którą stronę (bo żeby wczytać dużo danych do pamięci,
to być może trzeba będzie wyrzucić coś na swapa).
--
QRCZAK
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrczak.home.ml.org/
Re: Nietypowy Search Engine
Author: Jacek Kubica
Date: Thu, 14 May 1998 13:01
Date: Thu, 14 May 1998 13:01
22 lines
1721 bytes
1721 bytes
Qrczak wrote: > Przecież żeby przeszukać w pamięci komputera, to trzeba najpierw to > z dysku załadować! IMHO w sumie różnica będzie minimalna, i nie jest > powiedziane, w którš stronę (bo żeby wczytać dużo danych do pamięci, > to być może trzeba będzie wyrzucić co na swapa). "Tys prowda" , i dlatego dodalem: "To tez oczywiscie zalezy od serwera na ktorym takie poszukiwania wykonujesz (kwestie hardwarowe).Dalej aktualna jest sugestia o doswiadczalne sprawdzenie , ewentualnie pogadanie z adminem na ten temat. " Jacek -- = _//_ = mailto:kubica@ch.wssk.wroc.pl = http://zdo.wssk.am.wroc.pl/~kubica/ = = // = Jacek Kubica = SurGeoN = Webmaster of Regional Specialistic Hospital in Wroclaw =
Re: Nietypowy Search Engine
Author: Przemyslaw Popielarski
Date: Thu, 14 May 1998 19:28
Date: Thu, 14 May 1998 19:28
66 lines
3669 bytes
3669 bytes
Qrczak napisał(a) w wiadomości: ... >> open (PLIK, "$pliklog") || die "Nie moge otworzyc pliku: $pliklog\n"; >Wydaje mi się, że zamiast die lepiej to wypisać w tym HTMLu, >prawda? Niewatpliwie tak zrobie, i zrobil bym tow czesniej, gdybym to ja pisale te linijke. Szczerze mowiac, nie wiem nawet co robi 'die', a takze co daje ||... Przypuszczam, ze chodzi o to, ze jesli otworzenie pliku nie powiedzie sie, to wypisuje komunikat. >Akurat na rekord użyłbym bezpośrednio zmiennej $_. Tak więc: [...] >Flaga /o jest tutaj _bardzo_ przydatna - powoduje, że wyrażenie >regularne będzie skompilowane tylko raz, a nie przy każdym użyciu, co >powinno znacząco przyspieszyć. Flaga ta jest sensowna tylko jeśli >wyrażenie regularne formalnie nie jest stałe, ale skądinąd wiemy, że >wszystkie zmienne tam użyte się nie zmienią - tak jak tutaj. >Bo oczywiście jest to perlowe wyrażenie regularne, a nie kawałek tekstu. >Użytkownik powinien to wiedzieć. Jeśli miałby być wyszukany tylko >kawałek tekstu, to można by go zapisać tak: /\Q$szukane/io (zobacz >linuksowy man perlre). Z tym że część osób potrafi z wyrażeń regularnych >skorzystać, więc głupio by było taką możliwość niepotrzebnie zabierać. >Za to trzeba by się jakoś zabezpieczyć przez błędami składni w takim >wyrażeniu, bo skrypt się posypie. Chyba można wstępnie przetestować >to wyrażenie regularne wewnątrz eval, co pozwoli złapać błędy jego >składni podczas wykonania, nie przerywając działania skryptu Kurcze, Qrczak, z tego ww. kawalka nic tak naprawde nie rozumiem. >IMHO prościej czytać tutaj na bieżąco z pliku. Dodatkowo nie będziemy >czytać całego pliku, jeśli będzie tego więcej niż 30. O! I to jest 100% argument nie do pobicia. Nie wpadlem na to. O dziwo zreszta, takie czytanie po linijce dziala duzo duzo szybciej! Przeszukuje mi te 34000 rekordow w mig, a przedtem potrzebowal kolo 5 sekund! >> Ale moj problem jest troche zlozony... >IMHO nie jest :-) Dla mnie jest :( I im bardziej sie wglebiam w ten jezyk, tym go mniej rozumiem. Coz, ide studiowac te many. Dzieki wielkie Qrczak, bardzo mi pomogles. Aha, na koniec mam jeszcze jedno pytanko: poniewaz korzystam z Twojej metody czytania linijek tylko do jakiejs tam wartosci (30), to nie wiem, ile plik ma linijek. Czy jest metoda, aby sprawdzic ile plik ma linijek _natychmiastowo_ ? (bez wczytywania go calego do pamieci). Chodzi o to, ze chce wypisywac *przed* wyszukiwaniem, ile jest dostepnych rekordow. Chce, zeby ta informacja pojawiala sie bez opoznien. Ale jesli sie nie da, to nic. Nie jest mi to niezbedne... ./ premax ./ abe@ikp.pl, premax@abe.com.pl ./ uin 9022511 ./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Przemyslaw Popielarski
Date: Thu, 14 May 1998 19:35
Date: Thu, 14 May 1998 19:35
25 lines
1987 bytes
1987 bytes
Przeszukiwanie linijka po linijce u mnie pod win95 wychodzi natychmiast! Natomiast wczytanie calego pliku i przeszukanie go bralo ok 5 sekund. Nie wiem jak jest na linuxie, jeszcze nie wyprobowalem. Czy moge miec do Was jeszcze jedno glupie (i troszke offtopicowe) pytanie? Gdzie _zazwyczaj_ uzytkownik powinien na serverze linuxowym umiescic swoje pliki CGI? Podkreslam _zazwyczaj_, bo chodzi mi o zwyczaj przyjety przez adminow, gdzie sie takie katalogi ustala (wiem, ze moga oni sobie ustalic gdzie chca). Chodzi mi przykladowo o server Apache. Mozna w nim dokladnie zdefiniowac, w ktorych katalogach mozna uruchamiast CGI. Ja sobie jakos tam zdefiniowalem. Ale jak to sie powinno _zwyczajowo_ robic ? Tzn z punktu widzenia normalnego usera, nie admina. Czy umieszczam to w zwyczajowym katalogu ~user/public_html, czy gdzie indziej ? Dzieki, ./ premax ./ abe@ikp.pl, premax@abe.com.pl ./ uin 9022511 ./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Andrzej Bort
Date: Fri, 15 May 1998 11:56
Date: Fri, 15 May 1998 11:56
68 lines
4039 bytes
4039 bytes
Przemyslaw Popielarski <abe@ikp.pl> wrote:
>>IMHO prościej czytać tutaj na bieżąco z pliku. Dodatkowo nie będziemy
>>czytać całego pliku, jeśli będzie tego więcej niż 30.
> O! I to jest 100% argument nie do pobicia. Nie wpadlem na to. O dziwo
> zreszta, takie czytanie po linijce dziala duzo duzo szybciej! Przeszukuje
> mi te 34000 rekordow w mig, a przedtem potrzebowal kolo 5 sekund!
No.. ja jak ostatnio robiłem sobie w domu CGI z założeniami:
- jedna linia - jeden rekord,
- 4 pola w linii (nie zmienia się to), separatorem pola jest |,
- plik miał ok. 400 rekordów (w sumie ok. 40-50 KB),
- dla każdego rekodu były 3 pola i czwarte jako tzw. klucz (w HTMLu
stosowałem "<OPTION NAME=... VALUE=...>" (czy jakoś tak, nie pamiętam
dokładnie,
- skrypt "dwuprzebiegowy": pierwszy przebieg: znaleźć unikalne wartości
klucza (pole nr 3) i wypisać zawartości pola nr 1, drugi przebieg: na
podstawie $QUERY_STRING analizować wybrane klucze, przeszukiwać bazę,
wypisywać wartości pola nr 2 jako nagłówek, a potem za pomocą <ul>
wszystkie pola nr 4 (jeśli pole nr 3 zostało wybrane przez usera).
Na początku stosowałem "brute force", ale jak mi Netszkapa zaczęła zwracać
"document contains no data", to się zacząłem zastanawiać. Efekt:
zwiększenie IdleTimeout w konfigu Apache (nie skutkowało zmienianie
wartości $|). Po jakimś czasie dla 168 unikalnych kluczy i niecałych 400
linii program się wykonywał ~40 sekund. Po zmianie algorytmu (do tego
musiałem poczytać man perllol :->) i wczytaniu pliku naraz do pamięci, i
przeszukiwaniu pamięci (a nie dysku), mimo małego rozmiaru pliku, load avg
dosłownie 0, bo tylko tym się zajmowałem (w ogóle warunki się nie
zmieniły), skrypt zaczął się wykonywać max 3 sekundy (zamiast ponad 40).
Z tym, że to było nieco inne zadanie. Tobie być może wystarczy
przeszukiwać plik.
>>> Ale moj problem jest troche zlozony...
>>IMHO nie jest :-)
> Dla mnie jest :(
> I im bardziej sie wglebiam w ten jezyk, tym go mniej rozumiem.
> Coz, ide studiowac te many.
> Dzieki wielkie Qrczak, bardzo mi pomogles.
> Aha, na koniec mam jeszcze jedno pytanko:
> poniewaz korzystam z Twojej metody czytania linijek tylko do jakiejs tam
> wartosci (30), to nie wiem, ile plik ma linijek. Czy jest metoda, aby
> sprawdzic ile plik ma linijek _natychmiastowo_ ? (bez wczytywania go calego
> do pamieci).
> Chodzi o to, ze chce wypisywac *przed* wyszukiwaniem, ile jest dostepnych
> rekordow. Chce, zeby ta informacja pojawiala sie bez opoznien. Ale jesli sie
> nie da, to nic. Nie jest mi to niezbedne...
albo za pomocą system(); i "wc -l" (jeśli to jakiś unix), albo np tak:
$lines=0;
open (PLIK, "sciezka_do_pliku");
while (<PLIK>) {
$lines++
}
;-)
--
-- Andrzej Bort Silesian Technical Univ., Computer Center, Gliwice, Poland
-- e-mail: bort <AT> polsl.gliwice.pl Office phone: (+48-32) 230-76-86
-- IRC: Juan For PGP key look at: http://zeus.polsl.gliwice.pl/~bort/
-- ** The office box said: W'95, NT 4.0 or better. So I installed Linux **
Re: Nietypowy Search Engine
Author: Piotr Piatkowski
Date: Fri, 15 May 1998 12:12
Date: Fri, 15 May 1998 12:12
28 lines
2017 bytes
2017 bytes
Qrczak <qrczak@knm.org.pl> wrote:
:> open (PLIK, "$pliklog") || die "Nie moge otworzyc pliku: $pliklog\n";
: Wydaje mi się, że zamiast die lepiej to wypisać w tym HTMLu, prawda?
IMHO najlepiej jest zrobić zaraz na początku programu coś w tym stylu:
$SIG{__DIE__} = sub {
die @_ if ! defined $^S; # Nie obsługuj die wewnątrz eval
print "Content-type: text/html; charset=ISO-8859-2\n\n";
print "Wystąpił niespodziewany błąd w programie:<br>\n";
print "<pre>$_[0]</pre>";
exit 1;
}
A później już można "po staremu" wstawiać wszędzie die. Przy okazji
dostaniemy komunikat błędu w HTML także przy błędzie run-time
(normalnie kończy się to komunikatem "Internal server error").
Oczywiście można to rozbudować - w swoim moduliku mam zamiast prostego
wypisania komunikatu także wypisanie "stosu", czyli jakie procedury
były kolejno wywołane zanim doszło do błędu, a także wypisuję
"Content-type" tylko wtedy jeśli wcześniej go już nie wypisałem. Ale
powyższe jest proste, praktyczne i działa :-)
--
Piotr Piątkowski, Uczelniane Centrum Informatyki, AGH Krakow, POLAND
Re: Nietypowy Search Engine
Author: Qrczak
Date: Fri, 15 May 1998 14:08
Date: Fri, 15 May 1998 14:08
43 lines
3212 bytes
3212 bytes
On Thu, 14 May 1998, Przemyslaw Popielarski wrote:
> >Flaga /o jest tutaj _bardzo_ przydatna - powoduje, że wyrażenie
> >regularne będzie skompilowane tylko raz, a nie przy każdym użyciu, co
> >powinno znacząco przyspieszyć. Flaga ta jest sensowna tylko jeśli
> >wyrażenie regularne formalnie nie jest stałe, ale skądinąd wiemy, że
> >wszystkie zmienne tam użyte się nie zmienią - tak jak tutaj.
>
> >Bo oczywiście jest to perlowe wyrażenie regularne, a nie kawałek tekstu.
> >Użytkownik powinien to wiedzieć. Jeśli miałby być wyszukany tylko
> >kawałek tekstu, to można by go zapisać tak: /\Q$szukane/io (zobacz
> >linuksowy man perlre). Z tym że część osób potrafi z wyrażeń regularnych
> >skorzystać, więc głupio by było taką możliwość niepotrzebnie zabierać.
> >Za to trzeba by się jakoś zabezpieczyć przez błędami składni w takim
> >wyrażeniu, bo skrypt się posypie. Chyba można wstępnie przetestować
> >to wyrażenie regularne wewnątrz eval, co pozwoli złapać błędy jego
> >składni podczas wykonania, nie przerywając działania skryptu
>
> Kurcze, Qrczak, z tego ww. kawalka nic tak naprawde nie rozumiem.
A wiesz, co to są wyrażenia regularne?
> poniewaz korzystam z Twojej metody czytania linijek tylko do jakiejs tam
> wartosci (30), to nie wiem, ile plik ma linijek. Czy jest metoda, aby
> sprawdzic ile plik ma linijek _natychmiastowo_ ? (bez wczytywania go calego
> do pamieci).
Fizycznie nie ma sposobu, żeby sprawdzić liczbę linijek pliku bez
przeczytania jego całego (niekoniecznie wczytując go naraz do pamięci).
Przecież linie są różnej długości, oddzielone tylko znakiem końca linii
- ilość linii nie jest nigdzie pamiętana.
Można najwyżej próbować np. wczytać mało linijek, policzyć ich długość
i na podstawie wielkości całego pliku wyprorokować przybliżoną ilość
linii. Można gdzieś na boku pamiętać ilość linii z poprzedniego
przebiegu, a nawet oceniając daty plików można sprawdzić, czy jest
aktualna.
--
QRCZAK
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrczak.home.ml.org/
Re: Nietypowy Search Engine
Author: Przemyslaw Popielarski
Date: Fri, 15 May 1998 22:46
Date: Fri, 15 May 1998 22:46
14 lines
1296 bytes
1296 bytes
Qrczak napisał(a) w wiadomości: ... >A wiesz, co to są wyrażenia regularne? Juz wiem :) Tak naprawde nie wiedzialem, ze to sie tak nazywa. Ale uzywam tego regularnie (stad nazwa :) ) np. w homesite. Dzieki za pomoc, -- ./ premax ./ abe@ikp.pl, premax@abe.com.pl ./ uin 9022511 ./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Przemyslaw Popielarski
Date: Fri, 15 May 1998 23:07
Date: Fri, 15 May 1998 23:07
29 lines
1750 bytes
1750 bytes
Andrzej Bort napisał(a) w wiadomości:
>> Czy jest metoda, aby
>> sprawdzic ile plik ma linijek _natychmiastowo_ ? (bez wczytywania go
calego
>> do pamieci).
>$lines=0;
>open (PLIK, "sciezka_do_pliku");
>while (<PLIK>) {
> $lines++
>}
>
>;-)
Usmiech niepotrzebny... patent chodzi wspaniale. Daje minimalne opoznienie.
Pojawil sie tylko nowy maly problemik. Bowiem o ile moge sie domyslac,
wskaznik w pliku po wykonaniu ww. petelki znajdzie sie na koncu.
Natomiast ja chce potem jechac od poczatku. Na pewno jest jakis sposob typu
seek (PLIK,0) albo cos w tym stylu... tyle, ze ja nie wiem jaki.
Doraznie wstawilem zamkniecie i ponowne otwarcie pliku, ale to chyba malo
eleganckie.
./ premax
./ abe@ikp.pl, premax@abe.com.pl
./ uin 9022511
./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Piotr Piatkowski
Date: Sat, 16 May 1998 11:41
Date: Sat, 16 May 1998 11:41
11 lines
1450 bytes
1450 bytes
Przemyslaw Popielarski <abe@ikp.pl> wrote: : Pojawil sie tylko nowy maly problemik. Bowiem o ile moge sie domyslac, : wskaznik w pliku po wykonaniu ww. petelki znajdzie sie na koncu. : Natomiast ja chce potem jechac od poczatku. Na pewno jest jakis sposob typu : seek (PLIK,0) albo cos w tym stylu... tyle, ze ja nie wiem jaki. Prawie dobrze. seek( PLIK, 0, 0 ). Co się stało z Twoim manualem? -- Piotr Piątkowski, Uczelniane Centrum Informatyki, AGH Krakow, POLAND
Re: Nietypowy Search Engine
Author: Przemyslaw Popielarski
Date: Sat, 16 May 1998 17:48
Date: Sat, 16 May 1998 17:48
14 lines
1383 bytes
1383 bytes
Piotr Piatkowski napisał(a) w wiadomości: <6jju13$dgk$1@galaxy.uci.agh.edu.pl>... >: seek (PLIK,0) albo cos w tym stylu... tyle, ze ja nie wiem jaki. >Prawie dobrze. seek( PLIK, 0, 0 ). Co się stało z Twoim manualem? Hmm... brak. Ale bedzie wkrotce. Dzieki :) ./ premax ./ abe@ikp.pl, premax@abe.com.pl ./ uin 9022511 ./ koniec i bomba, a kto czytal ten traba. w.g.
Re: Nietypowy Search Engine
Author: Marek Jedlinski
Date: Sat, 23 May 1998 23:59
Date: Sat, 23 May 1998 23:59
48 lines
2186 bytes
2186 bytes
Jacek Kubica <webmaster@zdo.wssk.am.wroc.pl> wrote: >Zalozenie: szukasz $query w linii $line > >Przyklad (ktory dziala!) > >#!/usr/local/bin/perl >$query = "pErL"; >$line = "Chetnie ucze sie Perla, bo lubie Perla"; >$temp = $line; >$query =~ y/[A-Z]/[a-z]/; >$temp =~ y/[A-Z]/[a-z]/; >$pocz = index($temp,$query); >$dlugosc = length($query); >$wyraz = substr($line,$pocz,$dlugosc); >$line =~ s/$query/<b>$wyraz<\/b>/gi; >print $line; > >========================================= >Wynik : "Chetnie ucze sie <b>Perl</b>a , bo lubie "<b>Perl</b>a Ale to mozna uproscic i nie uzywac zadnych dodatkowych zmiennych, oprocz tych, ktore Perl i tak dla nas definiuje (tutaj akurat $1). Na przyklad tak: #!/usr/local/bin/perl -w $line = "Chetnie ucze sie Perla, bo PERL jest cool i lubie Perla"; $query = "pErL"; $line =~ s/($query)/<B>$1<\/B>/gi; print "$line\n"; ========================================= wynik: Chetnie ucze sie <B>Perl</B>a, bo <B>PERL</B> jest cool i lubie <B>Perl</B>a Ja tez nie jestem pewien, czy dokladnie o to chodzilo, ale rezultat wykonania skryptu jest identyczny z rezultatem Jacka :-) .marek -- After things go from bad to worse, the cycle will repeat itself. http://come.to/fnord/
Re: Nietypowy Search Engine
Author: Jacek Kubica
Date: Sun, 24 May 1998 23:23
Date: Sun, 24 May 1998 23:23
19 lines
1521 bytes
1521 bytes
Marek Jedlinski wrote: > $line =~ s/($query)/<B>$1<\/B>/gi; > print "$line\n"; > Ja tez nie jestem pewien, czy dokladnie o to chodzilo, ale rezultat > wykonania skryptu jest identyczny z rezultatem Jacka :-) > > .marek Chyle czolo. Tak jest o wiele prosciej :-). Nie nabylem jeszcze bieglosci w poslugiwaniu sie "zawilolosciami" magicznych zmiennych $ ... Jacek --------------------------------------------------------- _//_ = mailto:kubica@ch.wssk.wroc.pl _ _ = http://zdo.wssk.am.wroc.pl/~kubica/ = // = Jacek Kubica M.D = SurGeoN =
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads