有人可以告诉我,如果在@rx
中拥有所有这些特殊字符是否安全?我关注的是#
!
和$
。
如果不安全,我如何确保正则表达式不会解释@rx
中的元素?
#!/usr/bin/perl
use strict;
use warnings;
my $doc = do { local $/; <STDIN> };
my @rx = (
'mariadb:\n build: ',
'#!/bin/bash\n\n/usr/bin/mysqld_safe',
'FROM centos:7',
'#!/bin/sh\n# This is /usr/libexec/mariadb-',
'#!/bin/bash\nVOLUME_HOME="/var/lib/mysql"',
'#!/bin/bash\nMYSQL="/usr/bin/mysql -u$DB_ENV_DBUSER'
);
my @a = ();
foreach my $r (@rx) {
push @a, $doc =~ /($r.{3000})/sg;
}
my $n = int(rand(999999999999999));
for my $i (0 ..$#a) {
system("echo '$a[$i]' > ext$n$i");
}
答案 0 :(得分:4)
您可以通过执行以下操作自动转义任何必要的字符:
push @a, $doc =~ /(\Q$r\E.{3000})/sg;
但你的正则表达可能不像你想要的那样工作;它只会在文件的第一部分找到你的字符串,而不是它们扩展到最后3000个字符。如果它们之间没有其他3000个字符,它也只能找到两个中的一个。这两个问题都可以通过以下方式解决:
push @a, $doc =~ /(?=(\Q$r\E.{0,3000}))/sg;