如何从Perl CGI脚本中删除ASCII码28 0x1C(FS)?

时间:2015-05-22 10:14:00

标签: perl character ascii

我有以下代码段

@trunkarray = split(/:/,$trunkid);
my $compString = "";

foreach $value ( @trunkarray ) {
    print "<TR> <TD> $value </TD> </TR>";

    if ( ! ($compString) ) {
        $compString = "$value";
    }
    else {
        $compString = $compString . ",$value";
    }
}   

&updateOperation($compString);

$CompString变量已发送至updateOperation

我的脚本在上述语句中的逗号FS,之后给出了一个特殊字符$value(代码点28或0x1C)。当我在Notepad ++中粘贴输出时,我发现了这个特殊字符。

任何人都可以告诉我为什么我会得到这个特殊字符,以及是否有办法删除它?

由于这个特殊字符,我的数据库操作(在updateOperation子例程下)正在中止;由于此字符串作为更新操作的参数传递,如下所示:

sub updateOperation
{
    my($trunkgrplist) = @_;
    $UPDATE= "update TRUNKGROUP set source='D' where trunkgrpid in ($trunkgrplist)";
..
}

1 个答案:

答案 0 :(得分:3)

无论出于何种原因,你都有相应的

my $compString = "428331:\x{1C}428332:\x{1C}428333";

您可以使用

进行修复
$compString =~ s/\x1C//g;

$compString =~ tr/\x1C//d;

您的代码变为

sub updateOperation {                                  # XXX Bad name
   my @trunk_grp_ids = @_;

   while (@trunk_grp_ids) {
      my $trunk_grp_ids_list =
         join ', ',
            map $dbh->quote($_),
               splice(@trunk_grp_ids, 0, 500);

      $dbh->do("
         UPDATE TRUNKGROUP
            SET source='D'
          WHERE trunkgrpid in ( $trunk_grp_ids_list )
      ");
   }
}   

my $compString = "428331:\x{1C}428332:\x{1C}428333";   # XXX Bad name
$compString =~ tr/\x1C//d;
my @trunk_grp_ids = split /:/, $compString;
updateOperation(@trunk_grp_ids);