加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何将替换正则表达式作为命令行参数传递给perl脚本

发布时间:2020-12-14 06:06:08 所属栏目:百科 来源:网络整理
导读:我正在尝试编写一个简单的perl脚本来将一个给定的正则表达式应用于文件名等,并且我无法将正则表达式作为参数传递给脚本. 我希望能做的是这样的事情: myscript 's/hi/bye/i' hi.hbye.h 我已经制作了这段代码 #!/utils/bin/perl -wuse strict;use warnings;my
我正在尝试编写一个简单的perl脚本来将一个给定的正则表达式应用于文件名等,并且我无法将正则表达式作为参数传递给脚本.

我希望能做的是这样的事情:

> myscript 's/hi/bye/i' hi.h
bye.h
>

我已经制作了这段代码

#!/utils/bin/perl -w
use strict;
use warnings;

my $n_args = $#ARGV + 1;
my $regex =  $ARGV[0];
for(my $i=1; $i<$n_args; $i++) {
  my $file = $ARGV[$i];

  $file =~ $regex;
  print "OUTPUT: $filen";
}

我不能使用qr,因为显然它不能用于替换正则表达式(虽然我的来源是一个论坛帖子所以我很高兴被证明是错误的).

我宁愿避免将这两个部分作为单独的字符串传递并在perl脚本中手动执行正则表达式.

是否有可能将正则表达式作为这样的参数传递,如果是这样,最好的方法是什么?

解决方法

我想,有不止一种方法可以做到这一点.

Evial方式:

由于您基本上发送了一个正则表达式,因此可以对其进行求值以获得结果.像这样:

my @args = ('s/hi/bye/','hi.h');
my ($regex,@filenames) = @args;
for my $file (@filenames) {
  eval("$file =~ $regex");
  print "OUTPUT: $filen";
}

当然,按照这种方式将打开你一些非常讨厌的惊喜.例如,考虑传递这组参数:

...
my @args = ('s/hi/bye/; print qq{MINE IS AN EVIL LAUGH!n}','hi.h');
...

是的,它会最狡猾地嘲笑你.

安全方式:

my ($regex_expr,@filenames) = @args;
my ($substr,$replace) = $regex_expr =~ m#^s/((?:[^/]|/)+)/((?:[^/]|/)+)/#;
for my $file (@filenames) {
  $file =~ s/$substr/$replace/;
  print "OUTPUT: $filen";
}

如您所见,我们将给出的表达式解析为两部分,然后使用这些部分构建一个完整的运算符.显然,这种方法不够灵活,但当然,它更安全.

最简单的方法:

my ($search,$replace,@filenames) = @args;
for my $file (@filenames) {
  $file =~ s/$search/$replace/;
  print "OUTPUT: $filen";
}

是的,没错 – 根本没有正则表达式解析!这里发生的是我们决定采用两个参数 – “搜索模式”和“替换字符串” – 而不是单个参数.它会使我们的脚本不像前一个那么灵活吗?不,因为我们仍然需要或多或少地定期解析正则表达式.但是现在用户清楚地理解了给命令的所有数据,这通常是一个很大的改进. )

两个示例中的@args对应于@ARGV数组.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读