/ / Wie verwende ich Perl, um Substitutionen basierend auf Berechnungen durchzuführen? - Regex, Perl, File-Io

Wie verwendet man Perl, um auf Berechnungen basierende Ersetzungen durchzuführen? - Regex, Perl, Datei-Io

Ich versuche, ein Perl-Skript für die Suche zu schreibenSuchen Sie in einer Textdatei alle Dezimalzahlen und ändern Sie sie mit einem Skalierungsfaktor. Bisher ist es mir gelungen, die Zahlen mit regulären Ausdrücken zu extrahieren:

open(INPUT, $inputPath) or die "$inputPath cannot be opened.";

while ($thisLine = <INPUT>) {
while ($thisLine =~ m/(-*d+.d+)/g) {
if(defined($1)) {
$new = $scalingFactor*$1;
print $new."n";
}
}
}

close (INPUT);

Ich habe jedoch noch nicht herausgefunden, wie ich die neuen Werte wieder in die Datei einfügen kann. Ich habe es mit versucht s/(-*d+.d+)/$scalingFactor*$1/g für die Ersetzung, aber dies fügte natürlich die Zeichenfolgendarstellung von $scalingFactor anstatt den Ausdruck auszuwerten.

Ich bin ein Perl-Neuling, daher wäre jede Hilfe sehr dankbar. Vielen Dank im Voraus.

-Dan

Bearbeiten: Lösung (basierend auf der Antwort von Roman)

while ($thisLine = <INPUT>) {
$thisLine =~ s/(-*d+.d+)/$scalingFactor*$1/ge;
prinf OUTPUT $thisLine;
}

Alternativ hat Seans Lösung auch für mich hervorragend funktioniert. Vielen Dank an alle!

Antworten:

4 für die Antwort № 1
s/(-*d+.d+)/$scalingFactor*$1/ge

(beachten e schlussendlich)


4 für die Antwort № 2

Hier ist eine eigenständige Unterroutine, die den Job erledigt. Es verwendet die spezielle Variable $^I, wodurch Perls In-Place-Bearbeitungsfunktion aktiviert wird. (Weitere Informationen finden Sie auf der Manpage "perlvar" unter $^Iund die Manpage "perlrun" für Informationen über die -i Befehlszeilenschalter, der die direkte Bearbeitung aktiviert.)

use strict;  # Always.

sub scale_numbers_in_file_by_factor {
my ($path, $scaling_factor) = @_;
local @ARGV = ($path);
local $^I = ".bak";
while (<>) {
s/ ( -? d+ . d+ ) / $scaling_factor * $1 /gex;
print;
}
}

scale_numbers_in_file_by_factor("my-file.txt", .1);

Eine Sicherungsdatei wird durch Anhängen erstellt ".bak" auf den ursprünglichen Dateinamen. Ändere das ".bak" zu "" oben, wenn Sie keine Sicherung wünschen.

Möglicherweise möchten Sie Ihren regulären Ausdruck zur Erkennung von Zahlen optimieren. Wie geschrieben, werden keine Zahlen ohne einen nachgestellten Dezimalpunkt und mindestens eine Ziffer gefunden. Ich denke du willst auch -? einem optionalen Minuszeichen zu entsprechen, nicht -*, die mit einer beliebigen Anzahl von Minuszeichen übereinstimmen. Das Rechnen mit einer Zeichenfolge mit mehr als einem führenden Minuszeichen wird mit ziemlicher Sicherheit nicht das tun, was Sie wollen.


-1 für die Antwort № 3

Öffnen Sie ein Schreibdateihandle mit dem Namen OUTPUT und führen Sie aus print OUTPUT $ new