【问题标题】:How do I tell perl to execute a piece of generated Perl code?如何告诉 perl 执行一段生成的 Perl 代码?
【发布时间】:2010-03-29 16:25:53
【问题描述】:

我正在尝试捕获字符串cd /a/b/c 并进行以下转换 (作为更大的 Perl 程序的一部分)。

如果cd /a/b/c存在则转换cd /a/b/cchdir '/a/b/c'并执行chdir '/a/b/c'

我可以进行转换;我不能告诉perl 执行我的命令。

【问题讨论】:

  • 您能否具体说明您一般捕获的内容?任意shell命令?那为什么要用 Perl 来执行呢?

标签: perl ksh


【解决方案1】:
#!/usr/bin/perl

use strict; use warnings;

while ( my $line = <DATA> ) {
    if ( my ($path) = $line =~ m{^cd \s+ (/? (\w+) (?:/\w+)* )}x ) {
        warn "Path is $path\n";
        chdir $path
            or warn "Cannot chdir to '$path': $!";
    }
}

__DATA__
cd a
cd /a/b/c
cd /a

输出:

路径是一个
无法 chdir 到 'a':在 C:\Temp\k.pl 第 8 行第 1 行没有这样的文件或目录。
路径是 /a/b/c
无法 chdir 到 '/a/b/c':在 C:\Temp\k.pl 第 8 行第 2 行没有这样的文件或目录。
路径是 /a
无法 chdir 到“/a”:C:\Temp\k.pl 第 8 行第 3 行没有这样的文件或目录。

【讨论】:

    【解决方案2】:

    您真正想要的是一个调度表。当您遇到命令时,例如cd,您会在调度表中查找关联的子例程,在其中将有效命令映射到您要运行的代码:

    %调度 = ( cd => sub { chdir( $_[0] ) }, ... ); 而() { 我的($命令,@args)=拆分; 如果(存在 $dispatch{ $command } ) { $dispatch{ $command }->(@args); } }

    我在Mastering Perl 中有几个此类事情的扩展示例。这样做的好处是当你有新命令时你不会改变处理循环,你只处理你打算处理的命令。此外,您可以直接从配置中构造该调度表。

    【讨论】:

      【解决方案3】:

      如果你要查找的目录是事先知道的。

      $str = "blah blah cd /a/b/c blah";
      if ( $str =~ /cd \/a\/b\/c/ ){
        print "found\n";
        chdir("/a/b/c");
      }
      

      【讨论】:

      • 我在想这样的事情: $str = "cd /a/b/c"; @dir = 拆分 /\s/ , $str; $dir[1] = "chdir"; $new_dir = join ($" , @dir ); eval $new_dir; 那么,为什么我不能 cd/eval/exec $new_dir 命令去那里?
      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2011-04-22
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      相关资源
      最近更新 更多