Da dieser Code-Review ist, die einer nach dem anderen gehen lassen:
#!/use/bin/perl
dieser Linie sheBANG ist höchstwahrscheinlich ein Tippfehler . Es sollte wahrscheinlich
#!/usr/bin/perl
oder was auch immer which perl
auf Ihrem System zurückgibt.
use strict;
use warnings;
Gut.
open (FILE, "/home/user/Desktop/infile.phy") || die "cant open file\n";
Keine Notwendigkeit für globale Dateihandles des Pakets, wenn Sie lexikalische Dateihandles verwenden können. Die 3-Argumente-Form von open
ist heutzutage vorzuziehen. Auch sollte die Fehlermeldung, die Datei anzuzeigen, die Sie nicht öffnen können:
my $filename = '/home/user/Desktop/infile.phy';
open my $input, '<', $filename
or die "Cannot open '$filename' for reading: $!";
my @body = <FILE>;
Sie die Datei in ein Array schlürfen. Das ist in diesem Fall völlig unnötig.
my $count = 0;
my $string = '';
Deklarieren und initialisieren (falls erforderlich) alle Variablen im kleinstmöglichen Bereich.
my $count;
Die Variable $string
ist nirgendwo sonst in Ihrem Code verwendet.
foreach $_(@body){
Das ist albern. for
verwendet $ _, wenn keine Schleifenvariable angegeben ist. Es ist einfacher, die Dinge beizubehalten, wenn Sie stattdessen eine lexikalische Schleifenvariable angeben.
for my $line (@body) {
Aber ich glaube nicht, dass Sie die Datei schlürfen sollte.
if ($_ =~ m/[X]/){
, die in einem erfolgreichen Spiel ergibt, wenn die Leitung also ein X enthält, ist es zu /X/
gleichwertig. Das wird Ihnen jedoch das Wort, das das 'X' enthielt, nicht sagen. Dafür müssen Sie entscheiden, was ein Wort ist und Ihren Abgleich auf Wort-Ebene vornehmen.
Mit diesem Gedanken betrachte das folgende Skript. Ich habe eine vereinfachende Annahme in Bezug darauf gemacht, was ich als ein Wort betrachte.
#!/usr/bin/perl
use strict;
use warnings;
my $filename = "$ENV{TEMP}/test.txt";
open my $input, '<', $filename
or die "Cannot open '$filename' for reading: $!";
my $count;
while (my $line = <$input>) {
my @words = grep { /X/ } split /\b/, $line;
$count += @words;
print join(', ', @words), "\n";
}
print "$count\n";
__END__
UPDATE: Sie sollten alle Anforderungen gerecht zu werden, darauf aufzubauen in der Lage Wenn Sie nicht die Worte, egal in jeder Zeile zu finden, die ein oder mehr X-Zeichen haben, würde die while-Schleife sein vereinfacht:
while (<$input>) {
$count += (my @matches = /(X)/g);
print if @matches;
}
mit $ _. Dies ist jedoch wahrscheinlich ineffizient (da wir jedes übereinstimmende X-Zeichen speichern). In diesem Fall arbeitet tr
am besten:
my ($count, $n);
$n = tr/X// and $count += $n and print while <$input>;
Ist das Hausaufgaben? –
Ich dachte das gleiche, aber es könnte genauso gut ein Beispielproblem aus einem einleitenden Text sein. – inkedmn
Irgendwann müssen Sie Ihre 'andere Datei' öffnen und sicherstellen, dass Sie darauf schreiben. Versuchen Sie auch, diese Form von "offen" zu vermeiden; Verwenden Sie ein Formular, das den Dateizugriffspunkt für die Verwendung mit einer regulären $ -Variablen zurückgibt: open ($ fh, "filename"); oder eine der Varianten. –