Leser: 24
1 2 3 4 5 6 7 8 9
#!/usr/bin/perl open (IN, '+>', "test_values"); while (<IN>) { @line_array = split (/\t/, $_); if ($line_array[1] == 45) {print "success"}; } close (IN);
Guest b34bb_HMoin
Versuch mal im pattern \s statt \t, \s matcht auf whitespace, dann klappt das matching schonmal.
.
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
#!/usr/bin/perl use strict; use warnings; my $file='test_values'; open (my $fh, '+>', $file) or die "ERR $file $!"; my @lines=<$fh>; seek($fh,0,0); # zum Anfang der Datei for my $line (@lines) { chomp($line); my @line_array = split (/\t/, $line); if ($line_array[1] == 45) { print "success\n"; } else { print $fh "$line\n"; } } close ($fh);
2012-11-13T10:19:21 Student87Aber ich will einfach nur in der aktuellen Zeile ($_) etwas aendern
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
#!/usr/bin/perl
use strict;
use warnings;
my $file='test_values';
open (my $fh, '+<', $file) or die "ERR $file $!";
my @lines=<$fh>; # alle Zeilen einlesen
seek($fh,0,0); # zum Anfang der Datei
truncate($fh,0); # Dateigrösse 0
# Zeilen bearbeiten
for my $line (@lines) {
chomp($line);
my @line_array = split (/\t/, $line);
if ($line_array[1] == 45) {
print $fh "success\n"; # Zeile ersetzen
}
else {
print $fh "$line\n"; # unveränderte Zeile wieder in die Datei
}
}
close ($fh);
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
#! /usr/bin/perl use strict; use warnings; # Eingabedatei wird als Argument übergeben my $infile = shift(@ARGV) || die "no infile specified.\n"; # Ausgabedatei heisst wie Eingabedatei mit Endung ".new" my $outfile = $infile . ".new"; # oeffne Eingabe lesend open my $in, '<', $infile or die "open($infile,ro) failed: $!\n"; # oeffne Ausgabe schreibend open my $out, '>', $outfile or die "open($outfile,w) failed: $!\n"; # lese zeilenweise LINE: while ( my $line = <$in> ) { # trenne Zeile in Spalten auf my @columns = split /\t/, $line; # weiter mit naechster Zeile wenn Bedingung erfüllt next LINE if $columns[1] == 45; # Zeile scheint OK, schreibe sie in Ausgabedatei print $out $line or die "print to $outfile failed: $!\n"; } # schliesse Ausgabedatei close $out or die "close($outfile) failed: $!\n"; # schliesse Eingabedatei close $in; # ersetze Eingabedatei durch die Ausgabedatei rename($outfile,$infile) or die "rename($outfile,$infile) failed: $!\n";
2012-11-13T12:09:54 Student87Doch pq, ich beherzige das sehr, das "steht auf meiner Liste".
Quote1) Ich schreibe im Moment noch recht einfache Skripte, weil ich erst seit letzter Woche perl lerne. Da ist das Deklarieren des Scopes mit my noch nicht wichtig, weil es nicht zu Überschneidungen kommt.
Quote2) Und das ist der wichtigere Grund: Ich bin seit letzter Woche in Frankreich und arbeite hier fuer einen Professor an der Uni und muss daher erstmal den Fokus auf Ergebnisorientierung legen.
Quote(Meine Skripte sind zu klein, Fehler auf Grund von mangelnder Scope-Deklarierung kommen noch nicht vor)
2012-11-13T12:09:54 Student87Ich schreibe im Moment noch recht einfache Skripte, weil ich erst seit letzter Woche perl lerne. Da ist das Deklarieren des Scopes mit my noch nicht wichtig, weil es nicht zu Überschneidungen kommt.
2012-11-13T12:09:54 Student871) Ich schreibe im Moment noch recht einfache Skripte, weil ich erst seit letzter Woche perl lerne. Da ist das Deklarieren des Scopes mit my noch nicht wichtig, weil es nicht zu Überschneidungen kommt.
2012-11-13T12:09:54 Student87Doch pq, ich beherzige das sehr, das "steht auf meiner Liste".
Allerdings gibt es 2 Gründe, warum ich mich noch nicht durch die Tutorials gearbeitet habe / den Inhalt umgesetzt habe:
1) Ich schreibe im Moment noch recht einfache Skripte, weil ich erst seit letzter Woche perl lerne. Da ist das Deklarieren des Scopes mit my noch nicht wichtig, weil es nicht zu Überschneidungen kommt.
Quote2) Und das ist der wichtigere Grund: Ich bin seit letzter Woche in Frankreich und arbeite hier fuer einen Professor an der Uni und muss daher erstmal den Fokus auf Ergebnisorientierung legen.
Ich bin in der Phase, wo hier der erste Eindruck von mir entsteht. Und da my-Deklarierung für mich im Moment Zeitverlust ohne Debugging-Zeitgewinn (Meine Skripte sind zu klein, Fehler auf Grund von mangelnder Scope-Deklarierung kommen noch nicht vor) bedeutet, lass ich das erstmal aussen vor zugunsten der schnelleren Ergebnisse.
2012-11-13T12:09:54 Student87(Wobei ich deinen Code, Linuxer, auch nicht genau verstanden habe, weil mir teilweise Grundwissen fehlt - deshalb hab ich ganz Perl-like nach ner anderen Lösung gesucht).
2012-11-14T21:15:24 LinuxerFrag ruhig nach, wenn was unklar ist.
2012-11-17T13:03:11 Student87Wird dadurch der Code nicht unnötig lang?
Woher kommt der array @ARGV ?
2012-11-17T13:03:11 Student871) Warum speicherst du den Dateipfad in einer zusätzlichen Code-Zeile in einer Variablen? Wird dadurch der Code nicht unnötig lang? Ich könnte mir vorstellen, dass das Gegenargument "Sicherheit" lautet, richtig?
Quote2) Was macht "LINE:" ? Kann man damit etwa "while-handles" erschaffen so wie bei file-handles ?
Quote3) Woher kommt der array @ARGV ?
2012-11-17T13:03:11 Student871) Warum speicherst du den Dateipfad in einer zusätzlichen Code-Zeile in einer Variablen? Wird dadurch der Code nicht unnötig lang? Ich könnte mir vorstellen, dass das Gegenargument "Sicherheit" lautet, richtig?
perldoc perlvar...
@ARGV
The array @ARGV contains the command-line arguments intended for the script. $#ARGV is generally the number of arguments minus one, because $ARGV[0] is the first argument, not the program's command name itself. See $0 for the command name.
...