使用Perl 5.32.1进行的字符串替换没有按预期工作

前端开发 2026-07-08

字符串替换是程序员日常中常见的任务。當我把我的例行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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章