Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[PERL] Print wel in shell, niet naar file

Pagina: 1
Acties:
  • 198 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een Perl script geschreven die substring matching doet met 2 XML bestanden. Wanneer ik de script run, dan krijg ik mijn output wel in de shell, maar wanneer ik het wil opslaan in een file (perl script.pl > file), dan krijg ik alleen maar een leeg bestand. Ik zie de fout of glitch niet, en Perl geeft ook geen foutmelding. Kan iemand mij helpen? Bedankt!

code:
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
my @orphans2 = </xmlfiles/*>;
for(my $i = 0 ; $i < @orphans2 ; $i++) {

  my $filehandle = join "", $orphans2[$i];
  open($filehandle, "<$orphans2[$i]") or die("Could not open $!");
  my ($file) = $orphans2[$i] =~ /.*\/(\d+.xml)/;

  #####################################
  # Keeping track of the path (tags)  #
  ##################################### 
  my %path = ();
  my @tags = ();
  my @orphanPage = <$filehandle>;
  close($filehandle);

  for(my $c = 0 ; $c < @orphanPage ; $c++) {
    my $line = $orphanPage[$c];     
    chomp($line);
    if ($line =~ /\<name/) {
      my $name = $orphanPage[$c+1];
      chomp($name);
      print STDOUT "<topic file=\"$file\" name=\"$name\">\n";
    }

    if($line =~ /<(\w+\d*).*>/gi) {
      my $tag = $1; 
      push(@tags, $tag);
      $path{$tag}++;
    }
    if($line =~ /<\/\w+\d*>/gi) {
      pop(@tags);   
    }

    my $path = "";
    my $oldtag = "";
    foreach my $tag ( @tags ) {
      $oldtag = "/$tag\[$path{$tag}\]";
      $path = join "", $path, $oldtag;
    }

    $line =~ s/<[\/?]?\w+\d*(\w+[".:=\/?-]*\s*)*>/ /gi;

    my @targetFiles = <../Anchors/$file/*>;
    for(my $b = 0 ; $b < @targetFiles ; $b++) {
      my @tags2 = ();
      my %path2 = ();

      my $filehandle2 = join "", $targetFiles[$b];
      open($filehandle2, "< $targetFiles[$b]") or die("Could not open $!");
      my ($targetFile) = $targetFiles[$b] =~ /.*\/(\d+.xml).*/gi;
      #print "$targetFile\n";
      my @targetFileLines = <$filehandle2>;
      close($filehandle2);

      for(my $t = 0 ; $t < @targetFileLines ; $t++) {
    my $line3 = $targetFileLines[$t];

    if($line3 =~ /<(\w+\d*).*>/gi) {
      my $tag = $1;
      push(@tags2, $tag);
      $path2{$tag}++;
    }
    if($line3 =~ /(<\/\w+\d*)>/gi) {
      pop(@tags2);   
    }

    my $path2 = "";
    my $oldtag2 = "";
    foreach my $tag2 ( @tags2 ) {
      $oldtag2 = "/$tag2\[$path2{$tag2}\]";
      $path2 = join "", $path2, $oldtag2;
    }

    if($line3 =~ /^<name/gi) {
      my $title = $targetFileLines[$t+1];
      chomp($title);

      my $posStart = index $line, $title;

      while($posStart > -1) {
        my $posEnd = length($title) + $posStart;
            
            ##### PRINT WEL NAAR SHELL, NIET NAAR FILE
        print "$posStart - $file - $path - $targetFile - $path2 - $line - $title\n";

        $posStart = index $line, $title, $posStart+1;
      }
    }
      }
      
    }
  } 
  
}

  • Keiichi
  • Registratie: Juni 2005
  • Laatst online: 00:04
Les 1 perl hoe je naar bestanden schrijft
code:
1
2
3
open(FD,">file");
print FD "Dit gaat het bestand in";
close(FD);


Dit overschrijft het bestand elke keer weer, als je je file wilt appenden gebruik je >> ipv >

En nu vergelijken met je probleem gedeelte van je code, voor de middelste regel uit mijn code d:)b

Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/


  • Kuhlie
  • Registratie: December 2002
  • Niet online
Misschien kan je je code terugbrengen naar een heel klein stukje met alleen een print, en dan testen of je kunt redirecten naar een file. Zo niet, vertel dan ook even onder wat voor omgeving je zit.

Verwijderd

Topicstarter
Het probleem is dat er wel naar de STDOUT wordt geprint, maar wanneer ik in de shell de output probeer op te slaan naar een bestand, dat er dan niks gebeurd. Gek genoeg wordt alles wel geprint als ik voor de

code:
1
2
3
4
5
6
7
8
       while($posStart > -1) {
         my $posEnd = length($title) + $posStart;
            
            ##### PRINT WEL NAAR SHELL, NIET NAAR FILE
         print "$posStart - $file - $path - $targetFile - $path2 - $line - $title\n";

         $posStart = index $line, $title, $posStart+1;
       }


iets print, dan wordt alles, inclusief de print in deze loop, wel geschreven naar een bestand. Dus wanneer ik naar de STDOUT print (shell), dan gaat het wel goed. Wanneer ik de output probeer op te slaan naar bestand (perl script.pl > file), dan gebeurt er niks.

Mijn omgeving in UNIX. Heb het zowel getest op een Linux bak en Mac.

[ Voor 4% gewijzigd door Verwijderd op 29-09-2007 10:31 ]


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:54

Gonadan

Admin Beeld & Geluid, Harde Waren
Zet er anders ook nog even 2>&1 achter.
Dan gaan ook de foutmeldingen en dergelijken naar de file, en misschien ook wel je output. :)

[ Voor 13% gewijzigd door Gonadan op 29-09-2007 10:32 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
werkt helaas ook niet: perl script.pl > out 2>&1

Het bestand out blijft leeg, ik hoor mijn MacBook blazen, dus het blijft bezig, maar er wordt niks naar het bestand geschreven. Ik kan de output niet gewoon van de shell kopieren, omdat er heel veel output is.

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 22:54

Gonadan

Admin Beeld & Geluid, Harde Waren
Het bestand wordt dus wel aangemaakt?
Kan het niet iets met rechten zijn? :?

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
Het bestand wordt gewoon aangemaakt, en ik heb alle rechten. Wanneer ik vlak voor de laatste while loop een print doe, zoals

print "$posStart";

dan krijg ik wel alles in het bestand, maar alleen een hoop $posStart teveel.

Lijkt alsof Perl verstopt is, en dat er onderweg wat moet worden uitgelaten.
Pagina: 1