Schrift
[thread]11774[/thread]

Variable in Sub-Routine unbekannt (Seite 2)



<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
tecker
 2008-05-07 17:19
#109399 #109399
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ok, globale Variablen vermeiden und in Subroutinen mit Übergabeparametern arbeiten ... halte ich mal so fest.

Ja stimmt @ pq, da sollte ich wirklich mal eine Überprüfung mit einbauen und die perlsub-doc tue ich mir auch mal zu Gemüte ;)

Grüße
Struppi
 2008-05-07 17:55
#109404 #109404
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
tecker+2008-05-07 15:07:25--
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.
Wieso das? Der Reguläre Ausdruck verändert ja nicht den Wert der variabel.
renee
 2008-05-07 18:10
#109406 #109406
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Struppi+2008-05-07 15:55:27--
tecker+2008-05-07 15:07:25--
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.
Wieso das? Der Reguläre Ausdruck verändert ja nicht den Wert der variabel.


tecker verwendet s/// und das verändert den Wert von $filename.
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/
Struppi
 2008-05-07 18:11
#109407 #109407
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
oops, stimmt.
Gast Gast
 2008-05-07 19:39
#109408 #109408
Ich würde es so schreiben:

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/perl

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

##### Variablen #####

my $csv_dir = "csv_all";

##### Programm #####

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

foreach my $file (@filelist)
{
if($file =~ /extasc_cdr_(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})_(\d+).csv/)
{
my $id=$7;
unless( test_db($id,$dbh) ) { &update_db($cvs_dir,$file,$id,$dbh); }
else { print "-\n"; }
}
}

$dbh->disconnect;
close(DATEI);

##### Funktionen #####

sub test_db
{
my $id=shift(@_);
my $dbh=shift(@_);
my $sql_id_select = "SELECT * FROM csv_id WHERE csv_id=$id";
my $execute_select = $dbh->do($sql_id_select) or warn $dbh->errstr;
return 0 if($execute_select eq "0E0");
return 1;
}

sub update_db
{
my $cvs_dir=shift(@_);
my $file=shift(@_);
my $id=shift(@_);
my $dbh=shift(@_);
# 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";

# Warum machst du das so?
#--> open(DATEI, "cat $csv_dir/$file |") or die "Fehler beim oeffnen von $file: $!\n";
# Öffne die Datei doch einfach so:
open(DATEI, '<', "$csv_dir/$file") or die "Fehler beim oeffnen von $file: $!\n";

while(<DATEI>)
{
chomp $_;
my @spalten = split (/\,/, $_);

# $a und $b sind reservierte Variablen,
# die von perl bei "sort" verwendet werden.
# Darum bitte nicht nutzen.
my $s_a = $spalten[0];
my $s_b = $spalten[1];
my $s_c = $spalten[2];
# kann man auch so schreiben:
# my ($s_a,$s_b,$s_c)=@spalten;

# ...
# Passiert hier noch was?
# ...

}
}
tecker
 2008-05-09 12:53
#109479 #109479
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke, hab mein Skript mal ein wenig geändert ;)


Wusste garnicht dass bei einem
Code: (dl )
$file =~ /extasc_cdr_(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})_(\d+).csv/


die Werte autom. schon in $1,$2,... gespeichert werden. Erspart mir das s/// und ich kann/könnte die $filename Variable weiter verwenden.

ein my ($s_a,$s_b,$s_c)=@spalten kann ich leider nicht machen, da ich nicht nur 3 spalten brauche sondern 40 aus 130 die nicht fortlaufen sind.

Was noch folgt im Programm ist eine Überprüfung ob die Werte leer oder nicht defiert sind und im Fall das es so ist eine Zuweisung einer "0". Danach soll alles in eine DB rein.

Die Überprüfung wollte ich mit
Code: (dl )
if (not defined $s_a || $s_a eq ''){$s_a = 0;}
machen, klappt aber nicht immer, da er glaube kein eq Vergleich machen kann FALLS der Wert undef ist, oder??
FIFO
 2008-05-09 18:40
#109493 #109493
User since
2005-06-01
469 Artikel
BenutzerIn

user image
tecker+2008-05-09 10:53:19--

Die Überprüfung wollte ich mit
Code: (dl )
if (not defined $s_a || $s_a eq ''){$s_a = 0;}
machen, klappt aber nicht immer, da er glaube kein eq Vergleich machen kann FALLS der Wert undef ist, oder??


Code (perl): (dl )
1
2
3
4
5
$s_a = $s_a || 0;

# ODER:

$s_a = $s_a ? $s_a : 0;


sollte gehen, da undef hier wie auch der Leerstring zu 'falsch' evaluiert.

Nachtrag: Dein Konstrukt dürfte Probleme machen, weil 'defined' sich auf den folgenden Ausdruck bezieht, also $s_a || $s_a eq ''. Dieser Ausdruck ist aber immer defined, auch wenn er 'falsch' ist.
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
pq
 2008-05-09 19:14
#109494 #109494
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
FIFO+2008-05-09 16:40:26--
Code (perl): (dl )
1
2
3
4
5
$s_a = $s_a || 0;

# ODER:

$s_a = $s_a ? $s_a : 0;

Code (perl): (dl )
$s_a ||= 0;
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
FIFO
 2008-05-09 19:20
#109495 #109495
User since
2005-06-01
469 Artikel
BenutzerIn

user image
klar. Ist für den Poster prima vista vielleicht nicht so nachvollziehbar ...
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
Dubu
 2008-05-09 20:13
#109497 #109497
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
tecker+2008-05-09 10:53:19--
Die Überprüfung wollte ich mit
Code: (dl )
if (not defined $s_a || $s_a eq ''){$s_a = 0;}
machen, klappt aber nicht immer, da er glaube kein eq Vergleich machen kann FALLS der Wert undef ist, oder??


Das "not" hat eine niedrigere Priorität als das "||". Dein Ausdruck ist äquivalent zu
Code: (dl )
if (not (defined $s_a || $s_a eq ''))


Also Klammern setzen oder das höher priorisierte "!" zur Negation nehmen
Code: (dl )
if (! defined $s_a || $s_a eq '')

oder auch noch "or" statt "||" nehmen. ;)
Code: (dl )
if (not defined $s_a or $s_a eq '')


Ich weiß gerade nicht, was das PBP empfiehlt, aber generell werden die niedrig priorisierten logischen Operatoren eher selten eingesetzt, z.B. bei so etwas:
Code: (dl )
foobar(...) or die "..."
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



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