Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8895[/thread]

Zwei Dateien öffnen...geht komischerweise nicht!: Öffnen von Datein in PErl



<< >> 5 Einträge, 1 Seite
sKy
 2007-03-30 17:03
#75578 #75578
User since
2006-12-05
10 Artikel
BenutzerIn
[default_avatar]
Hi Leute ,

ich habe zwei Dateilisten in ein array gelesen, um sie über einen Index in dem
Array genau ansprechen zu können.

So steht Array1[1] und Array2[0] für das jeweils erste Element.

Wenn ich nun die Datei öffnen möchte, kommt folgender Fehler:

Can't use string ("< auto_1/dlf951121.1230.n3.tones") as a symbol ref while "strict refs" in use at tones_test.pl line 43, <FILE> line 282

Ich benutze use strict und use warnings.


Hier mal mein Code:

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/perl
use warnings;
use strict;

my @tones_array=(); #Dateinamen Tones
my @silben_array=(); #Dateinamen Silben
my @toneszeit=(); #Zeitpunkt Tones
my @toneswert=(); #Wert Tones
my @tonesinhalt=(); #Inhalt zum Splitten
my @silbenzeit=(); #Zeitpunkt Silben
my @silbenwert=(); #Wert Silben
my @silbeninhalt=();#Inhalt zum Splitten
my $i=0; #Index in der Dateiliste
my $tonespos=0; #Position Tones
my $silbenpos=0; #Position Silbe
my $zeile=0; #Zeilenzähler
my $gesamttones; #Anzahl tones pro Datei
my $gesamtsilben; #Anzahl Silben pro Datei
my $tones_datei=" ";
my $syl_datei=" ";
open (DATEI ,"< tones_list.tmp") or die "Konnte Datei nicht öffnen.\n";
while (<DATEI>)
{
chomp($_);
push(@tones_array,$_);
}
close(DATEI);


open (FILE ,"< syl_list.tmp") or die "Konnte Datei nicht öffnen.\n";
while (<FILE>)
{
chomp($_);
push(@silben_array,$_);
}
close(DATEI);

while ($i<=$#tones_array)
{

$tones_datei=$tones_array[$i];#Datei an Position [$i]
chomp($tones_datei);
open (TONES,"< $tones_datei" or die" $!\n");# -->FEHLER....WARUM?<--
print "Öffne Datei $tones_array[$i]\n";
while(<TONES>)
{

chomp($_);
$zeile++;
if ($zeile<=8) #Ignoriere die ersten acht Zeilen
{
next;
}
else
{
@tonesinhalt=split /\s+/;
push(@toneszeit,$tonesinhalt[1]);#Toneszeiten werden gespeichert
push(@toneswert,$tonesinhalt[3]);#Toneswert wird gespeichert
}
}
close(TONES);

$syl_datei=$silben_array[$i];#Datei an Position [$i]
chomp($syl_datei);
open (SILBEN,"< $syl_datei" or die "$!\n");
while(<SILBEN>)
{
print "Öffne Datei $silben_array[$i]\n";
s/#//g;
@silbeninhalt=split /\s+/;
push(@silbenzeit,$silbeninhalt[0]);#Silbenzeiten werden gespeichert
push(@silbenwert,$silbeninhalt[2]);#Silbenwert wird gespeichert
}
close(SILBEN);


my ($pfad,$dateiname) = $tones_array[$i] =~m|^(.*?/)([^/]+)$|;
my ($pfad2,$dateiname2) = $silben_array[$i] =~m|^(.*?/)([^/]+)$|;


open (INTERPRETATION,">>".$pfad."interpretation.txt" or die "$!");
print INTERPRETATION "Analysierte Tonesdatei: ". "$dateiname\n";
print INTERPRETATION "Analysierte Silbendatei: "."$dateiname2\n";
print INTERPRETATION "[Beginn der gesamten Nachricht]\n";

$gesamtsilben=$#silbenzeit;
if ($silbenpos >=$gesamtsilben)
{
$i++;
print INTERPRETATION "[Nachrichtenende]\n";
@tones_array=();
@silben_array=();
@toneszeit=();
@toneswert=();
@tonesinhalt=();
@silbenzeit=();
@silbenwert=();
@silbeninhalt=();
$tonespos=0;
$silbenpos=0;
$zeile=0;
$gesamttones=0;
$gesamtsilben=0;
}
else
{
if ($toneszeit[$tonespos] > $silbenzeit[$silbenpos])

{
print INTERPRETATION "Silbe: ". "-> ~unbetont\n";
$silbenpos++;
}
elsif ($toneszeit[$tonespos] < $silbenzeit[$silbenpos])
{
print INTERPRETAION "Silbe: $silbenwert[$silbenpos] ". "Pitch: $toneswert[$tonespos]\n";
$silbenpos++;
$tonespos++;
}
elsif ($toneszeit[$tonespos] = $silbenzeit[$silbenpos])
{
print INTERPRETAION "Silbe: $silbenwert[$silbenpos] ". "Pitch: $toneswert[$tonespos]\n";
$silbenpos++;
$tonespos++;
}

}
}


Das Problem macht immer jeweils der Open-Aufruf bei TONES.

Gruß
sKy
Ronnie
 2007-03-30 17:14
#75579 #75579
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
open (TONES,"< $tones_datei" or die" $!\n");# -->FEHLER....WARUM?<--

besser:
Code: (dl )
open (TONES, "<", $tones_datei) or die "$!\n";

siehe: http://perldoc.perl.org/functions/open.html\n\n

<!--EDIT|Ronnie|1175260576-->
sKy
 2007-03-30 17:27
#75580 #75580
User since
2006-12-05
10 Artikel
BenutzerIn
[default_avatar]
Danke werde ich mal versuchen
renee
 2007-03-30 19:25
#75581 #75581
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ein paar allgemeine Anmerkungen zum Code:

*) Variablen sollte man so spät wie möglich deklarieren.
*) Die 3-Argumente-Form von open bietet mehr Sicherheit. Also aus
Code: (dl )
open (FILE ,"< syl_list.tmp") or die "Konnte Datei nicht öffnen.\n";


das hier:
Code: (dl )
open (FILE ,"<", "syl_list.tmp") or die "Konnte Datei nicht öffnen.\n";


*) Bei der Fehlerabfrage auch den Grund mitliefern. Also:
Code: (dl )
open (FILE ,"<", "syl_list.tmp") or die "Konnte Datei nicht öffnen: $!.\n";


*) lexikalische Filehandles haben den Vorteil, dass sie automatisch geschlossen werden, wenn der Block verlassen wird. Ein lexikalischer Filehandle ist ein Skalar, also:
Code: (dl )
open (my $fh,"<", "syl_list.tmp") or die "Konnte Datei nicht öffnen: $!.\n";



*) Einlesen in ein Array geht auch einfacher. Einfach aus:
Code: (dl )
1
2
3
4
5
6
7
open (my $fh ,"<", "syl_list.tmp") or die "Konnte Datei nicht öffnen.\n";
while (<$fh>)
{
chomp($_);
push(@silben_array,$_);
}
close $fh;


das hier machen:
Code: (dl )
1
2
3
4
open (my $fh ,"<", "syl_list.tmp") or die "Konnte Datei nicht öffnen.\n";
my @silben_array = <$fh>;
chomp @silben_array;
close $fh;
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/
renee
 2007-03-30 19:30
#75582 #75582
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hinweise Teil II:

Code: (dl )
elsif ($toneszeit[$tonespos] = $silbenzeit[$silbenpos])
Du willst hier bestimmt keine Zuweisung machen, sondern vergleichen ob die Elemente gleich sind, oder?

Dann:
Code: (dl )
elsif ($toneszeit[$tonespos] == $silbenzeit[$silbenpos])


Wenn es keine Zahlen sind, die da verglichen werden, dann
Code: (dl )
elsif ($toneszeit[$tonespos] eq $silbenzeit[$silbenpos])



*) Die Zeilennummer braucht man normalerweise nicht "mitzuschleifen", da es hierfür eine Spezialvariable von Perl gibt: $..

Code: (dl )
1
2
3
4
open my $fh, "<", "syl_list.tmp" or die $!;
while( my $line = <$fh> ){
print $.,"\n";
}


Um Überraschungen mit $_ zu vermeiden, sollte man vor der while-Schleife ein local $_ machen oder - was mir persönlich besser gefällt - die Zeile in einer Variablen speichern (wie ich es im Beispiel obendrüber gemacht habe).
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/
<< >> 5 Einträge, 1 Seite



View all threads created 2007-03-30 17:03.