Schrift
[thread]8984[/thread]

Filehandle in die Datenbank



<< >> 10 Einträge, 1 Seite
Froschpopo
 2007-05-09 11:05
#76578 #76578
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Bisher schreibe ich ein JPEG-Bild wie folgt in eine Datenbank:
Code: (dl )
1
2
3
4
5
6
7
open(HANDLE, $file)
or die $!;

my $bin_data;
$bin_data .= for <HANDLE>;

...INSERT INTO fotos (bin_data, name) VALUES ($bin_data, $name)

geht das vll. noch etwas schöner?
renee
 2007-05-09 11:25
#76579 #76579
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
my $bin_data = do{ local (@ARGV,$/) = $file; <> };

....INSERT INTO fotos (bin_data, name) VALUES ($bin_data, $name)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2007-05-09 11:48
#76580 #76580
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
[quote=renee,09.05.2007, 09:25]
Code: (dl )
1
2
3
my $bin_data = do{ local (@ARGV,$/) = $file; <> };

....INSERT INTO fotos (bin_data, name) VALUES ($bin_data, $name)
[/quote]
sieht ziemlich kompliziert aus! was ist daran besser und warum?
Code: (dl )
local (@ARGV,$/) = $file; <> 

hab ich noch nie gesehen......
renee
 2007-05-09 12:22
#76581 #76581
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es ist nicht unbedingt besser, aber Du wolltest es "schöner" haben...

do-Block kennst Du, oder?

das
Code: (dl )
local (@ARGV,$/) = $file;
ist eine normale Zuweisung wie
Code: (dl )
 my (@array,$var) = $variable
auch - nur dass hier Spezialvariablen von Perl als "Ziel" verwendet werden. Das $file landet in @ARGV und $/ ist undef.

Dadurch dass $/ undef ist, wird von dem Filehandle alles in einem Rutsch eingelesen, währen bei Deiner Variante erst alles in eine Liste eingelesen wird und dann hängst Du die Elemente der Liste nacheinander an den Skalar.

die Verwendung von @ARGV soll dieses Beispiel verdeutlichen.
Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

use strict;
use warnings;

while( <> ){
print;
}


Aufruf: perl programm.pl irgendeine.datei

Zu <>

Quote
<FILEHANDLE> may also be spelled readline(*FILEHANDLE). See readline.

The null filehandle <> is special: it can be used to emulate the behavior of sed and awk. Input from <> comes either from standard input, or from each file listed on the command line. Here's how it works: the first time <> is evaluated, the @ARGV array is checked, and if it is empty, $ARGV[0] is set to "-", which when opened gives you standard input. The @ARGV array is then processed as a list of filenames.


Zu $/: perlvar
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2007-05-09 12:29
#76582 #76582
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Irgh wie krieg ich die Scheise jetzt in die Datenbank! Mit LOAD_FILE() kann ich ja nur von der Festplatte einlesen...

Code: (dl )
INSERT INTO fotos (name, daten) VALUES ('testbild', '$bin_data')

funktioniert alles nicht.
Muss ich die Datei vorher irgendwie quoten oder irgendwie anders escapen? Habs schon mit $DBI::quote() versucht aber ging auch nicht.

Code: (dl )
my $bin_data = $dbh->quote($filehandle); # funzt auch nicht

kann man alles knicken. Scheiss welt.\n\n

<!--EDIT|Froschpopo|1178699789-->
GwenDragon
 2007-05-09 12:55
#76583 #76583
User since
2005-01-17
14601 Artikel
Admin1
[Homepage]
user image
Etwas übermüdet, mein Frosch?

[quote=Froschpopo,09.05.2007, 10:29]
Code: (dl )
INSERT INTO fotos (name, daten) VALUES ('testbild', '$bin_data')
[/quote]
Ich dachte du willst:
Quote
INSERT INTO fotos (bin_data, name) VALUES ($bin_data, $name)

dann sollte es doch wohl:
Code: (dl )
INSERT INTO fotos (name, daten) VALUES ('testbild', $bin_data)
sein.\n\n

<!--EDIT|GwenDragon|1178700981-->
Froschpopo
 2007-05-09 12:57
#76584 #76584
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
jo isses auch :) Funktioniert tatsächlich nicht ohne quoting aber das ist ja sowieso besser mit!
pq
 2007-05-09 13:22
#76585 #76585
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=renee,09.05.2007, 09:25]
Code: (dl )
my $bin_data = do{ local (@ARGV,$/) = $file; <> };
[/quote]
oder einfach so?
my $bin_data = do{ local $/; <$file> };
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Ronnie
 2007-05-09 13:35
#76586 #76586
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ich würde vor jedem slurp die Dateigröße überprüfen!
Froschpopo
 2007-05-09 13:44
#76587 #76587
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
mach ich mit length
<< >> 10 Einträge, 1 Seite



View all threads created 2007-05-09 11:05.