Schrift
[thread]11774[/thread]

Variable in Sub-Routine unbekannt



<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
tecker
 2008-05-07 16:19
#109374 #109374
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
hi nochmal,

in meinem Skript habe ich u.a. filgende Variablen deklariert:

my $filename;
my $id=0;

Innerhalb des Funktionsblockes wird in $filename der Dateiname einer gefundenen Datei $file gespeichert und in $id eine in $file enthaltende ID. Anschließend mache ich einen Funktionsaufruf über &funktion;

In der Subroutine sub funktion{} ist dann allerdings $id bekannt und wird auch über einen print ausgegeben aber $file nicht. Habe mir dann mit einem

&funktion($file);

sub funktion { my ($name) = @_;}

geholfen.

Kann man sagen woran es liegt? Andernfalls poste ich mal mehr vom Inhalt des Skriptes.

Grüße
moritz
 2008-05-07 16:21
#109376 #109376
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Mach daraus ein kleines, nachvollziehbares Beispiel (das sonst nichts macht), dann können wir dir auch helfen.
tecker
 2008-05-07 16:35
#109385 #109385
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/perl

use strict;
use DirHandle;

my $file;
my $filename;
my $id = 0;
my $dir = "csv_files";

my $dh = DirHandle->new($dir);
my @filelist = sort $dh->read();
{
foreach $file (@filelist)

if ($file =~ /datei_(\d+).csv/)
{

$filename = $file;
$filename =~ s/datei_(\d+).csv/$1/;
$id = $1;

# hier kommen noch diverse sql sachen

&update($file);
}
}

sup update{
my ($name) = @_;
print "ID: $id - Filename: $name\n";




So in etwa siehts aus ... hab nur das drin worauf es grad ankommt. Fakt ist, dass ich $file übergeben muss da der Filename sonst nicht exisitiert in der Subroutine.


Gruß
nepos
 2008-05-07 16:36
#109387 #109387
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Steht in deiner Funktion vielleicht
Code (perl): (dl )
my $filename = ...
?

Ansonsten, wie Moritz schon sagte, ein brauchbares Beispiel bzw. Auszug aus deinem Code wäre hilfreich.
renee
 2008-05-07 16:41
#109389 #109389
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Gibt es eine Fehlermeldung oder wird einfach etwas ausgegeben, was Du nicht erwartest?

http://wiki.perl-community.de/bin/view/Wissensbasi...
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/
tecker
 2008-05-07 16:53
#109392 #109392
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ok, hier mal die detailiertere Version und Fehlermeldung. In dem Regex hole ich mir neben der ID noch das Datum raus, da ich das spätere noch verwende.

Bin auch dankbar für Vorschläge was genrelle Syntax angeht oder falls was uneffizient oder unsauber ist ;)

Vielen Dank schonmal



Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/perl

use strict;
use warnings;
use DirHandle;
use DBI;

##### Variablen ##############################

my $csv_dir = "csv_all";
my $filename;
my $file;
my $id = 0;
my ($a,$b,$c);

my $dbh = DBI ->connect('DBI:mysql:table', 'user', 'pw', {PrintError => 1});
my $dh = DirHandle->new($csv_dir);
my @filelist = sort $dh->read();
{

foreach $file (@filelist)
{

if($file =~ /extasc_cdr_(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})_(\d+).csv/)
{
$filename = $file;
$filename =~ s/extasc_cdr_(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})_(\d+).csv/$1 $2 $3 $4 $5 $6 $7/;
$id = $7;

# select auf ID in Datenbank machen um zu pruefen ob die csv-Datei schon in DB eingelesen wurde

my $sql_id_select = "SELECT * FROM csv_id WHERE csv_id=$id";
my $execute_select = $dbh->do($sql_id_select) or warn $dbh->errstr;

if ($execute_select eq "0E0") {&update_db($file);}
else {print "-\n";}
}
}
}

sub update_db{

# CSV-ID in Datenbank speichern
my $sql_id_insert = "INSERT into csv_id VALUES('',$id)";
my $execute_insert = $dbh->do($sql_id_insert) or warn $dbh->errstr;

print "ID: $id - File: $file\n";

open(DATEI, "cat $csv_dir/$file |") or die "Fehler beim oeffnen von $file: $!\n";
while(<DATEI>)
{
chomp $_;
(my @spalten) = split (/\,/, $_);

$a = $spalten[0];
$b = $spalten[1];
$c = $spalten[2];
}
}

$dbh->disconnect;
close(DATEI);


Beim ausführen erscheint für jedes gefundene File:

Use of uninitialized value in concatenation (.) or string at db.pl line 47.
ID: 030858 - File:
Use of uninitialized value in concatenation (.) or string at db.pl line 49.
cat: csv_all/: Ist ein Verzeichnis
Use of uninitialized value in concatenation (.) or string at db.pl line 47.
ID: 030859 - File:
Use of uninitialized value in concatenation (.) or string at db.pl line 49.




renee
 2008-05-07 16:59
#109393 #109393
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du solltest in der Sub auch $filename anstatt nur $file nehmen!
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/
tecker
 2008-05-07 17:07
#109396 #109396
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Naja dann bekomme ich ja den "zerflückten" Regex zurück. Daher hatte ich ja i$filename = $file; gemacht.

Ein print "$filename\n"; in der sub würde sowas wie "2008 03 10 15 46 03 031335"
liefern.
pq
 2008-05-07 17:11
#109397 #109397
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
daran liegt es nicht. du solltest zum einen in der sub update_db auch die parameter aus
der argumentenliste holen, das machst du ja gar nicht. du uebergibst was und benutzt
dann gleichzeitig die "globale" variable. sieht für mich etwas wirr aus.
desweiteren benutz du an einer stelle $7, obwohl du den erfolg von der regex davor gar nicht
getestet hast. was machst du im fehlerfall? immer erst testen, bevor du auf $1, $2 etc zugreifst.
lies mal
perlsub
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
renee
 2008-05-07 17:12
#109398 #109398
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nur für die Notizen:

Dann mache aus dem my $file; ein my $current_file;, aus foreach $file (@filelist) ein foreach my $file (@filelist) und in der Schleife dann noch $current_file = $file;

Aber

Globale Variablen sollte man sowieso vermeiden und mit Übergabeparametern arbeiten. Also möglichst viele Variablendeklarationen am Anfang des Skripts rausschmeißen und den Gültigkeitsbereich der Variablen möglichst klein halten.

Wie Du die Übergabeparameter ausliest weißt Du ja schon (my ($p1,$p2) = @_).
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/
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2008-05-07 16:19.