使用Perl 5.32.1进行的字符串替换没有按预期工作
字符串替换是程序员日常中常见的任务。當我把我的例行Perl代码从Fedora Core 7 (~2006) 升级到Recky 6.5 (2025) 时,某个MAGIC REPLACEMENT STRING没有起作用(从 $MAGIC_FROM_1 到 $MAGIC_TO_1,在HTML中,如下所示)。
我以为问题很可能出在我的 $MAGIC_FROM_1的 Perl语法上。将 $MAGIC_FROM_2 替换为 $MAGIC_TO_2 可以工作。请问有没有人能帮忙?在 $MAGIC_PATH 中的多个文件会一次性处理。
#! /usr/bin/perl
use strict;
use warnings;
my $MAGIC_PATH = "/home/mkido/bin/SQ_casted_1/db_gr";
# Generic Switch of _MAGIC_EXT1, usually
my $MAGIC_EXT1 = 0;
print "Type html, pl, txt, OR php.\n";
$MAGIC_EXT1 = <STDIN>; # read the next line
chomp ($MAGIC_EXT1);
my $MAGIC_FROM_1 = '<a href=\"http://www.google.com/\?q=';
my $MAGIC_TO_1 = "000_";
my $MAGIC_FROM_2 = "\">YouTube</a>";
my $MAGIC_TO_2 = "_999";
my $filename = "";
my @allfiles = "";
print "\nhello world\n\n";
opendir DIRHANDLER, $MAGIC_PATH;
@allfiles = readdir DIRHANDLER;
foreach $filename (sort @allfiles) {
print "$filename\n";
}
print "\n\n";
print "Now is the business\n";
foreach $filename (sort @allfiles) {
if( $filename =~ /$MAGIC_EXT1/ ){
print "$filename\n";
open (IN, "SQ_casted_1/db_gr/$filename");
open (my $fh, '>', "/home/mkido/bin/SQ_casted_2/db_gr/$filename");
while ( my $line1 = <IN> ){
if( $line1 =~ /http/ ){
(my $newline1 = $line1 ) =~ s/$MAGIC_FROM_1/$MAGIC_TO_1/g;
($newline1 = $line1 ) =~ s/$MAGIC_FROM_2/$MAGIC_TO_2/g;
print $fh $newline1;
}else{ print $fh $line1; }
} ### closing while-loop
close(IN);
close($fh);
} ### closing if_filename_has_html
}
print "\n\n";
解决方案
(my $newline1 = $line1 ) =~ s/$MAGIC_FROM_1/$MAGIC_TO_1/g;
($newline1 = $line1 ) =~ s/$MAGIC_FROM_2/$MAGIC_TO_2/g;
首先,将 $line1 赋值给 $newline1,然后替换Magic 1。接着,再把 $line1 赋值给 $newline(再次覆盖它此前的值,即第一次替换的结果),并替换Magic 2。
如果你确实需要保留原始行,可以这样修复:
(my $newline1 = $line1 ) =~ s/$MAGIC_FROM_1/$MAGIC_TO_1/g;
$newline1 =~ s/$MAGIC_FROM_2/$MAGIC_TO_2/g;
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。