如何告诉perl执行一段生成的Perl代码?

时间:2010-03-29 16:25:54

标签: perl ksh

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

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

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

3 个答案:

答案 0 :(得分:3)

#!/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

输出:

Path is a
Cannot chdir to 'a': No such file or directory at C:\Temp\k.pl line 8,  line 1.
Path is /a/b/c
Cannot chdir to '/a/b/c': No such file or directory at C:\Temp\k.pl line 8,  line 2.
Path is /a
Cannot chdir to '/a': No such file or directory at C:\Temp\k.pl line 8,  line 3.

答案 1 :(得分:2)

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

%dispatch = (
     cd => sub { chdir( $_[0] ) }, 
     ...
     );

while( <> )
     {
     my( $command, @args ) = split;
     if( exists $dispatch{ $command } )
          {
          $dispatch{ $command }->(@args);
          }
     }

我在Mastering Perl中有几个关于此类事情的扩展示例。关于这一点的好处是,当你有新的命令时你不会改变处理循环,而你只处理你想要处理的命令。此外,您可以直接从配置构建该调度表。

答案 2 :(得分:1)

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

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