2010-03-29 75 views
-1

我想抓住字符串cd /a/b/c并执行以下转换 (作为更大的Perl程序的一部分)。如何告诉perl执行一段生成的Perl代码?

如果cd /a/b/c存在,那么转换cd /a/b/cchdir '/a/b/c'和执行chdir '/a/b/c'

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

+0

你能指定一般你*捕捉*吗?一个任意的shell命令?那为什么用Perl来执行它? – reinierpost 2010-03-30 17:49:03

回答

1

如果您想查找的目录事先已知。

$str = "blah blah cd /a/b/c blah"; 
if ($str =~ /cd \/a\/b\/c/){ 
    print "found\n"; 
    chdir("https://stackoverflow.com/a/b/c"); 
} 
+0

我在想这样的事情: $ str =“cd/a/b/c”; @dir = split/\ s /,$ str; $ dir [1] =“chdir”; $ NEW_DIR =连接($”,@dir); EVAL $ NEW_DIR; 这样,为什么我不能CD/EVAL /执行的是$ NEW_DIR命令去那里? – 2010-03-29 20:29:29

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.
2

你真正想要的是一个调度表。当你遇到一个命令,像cd,你抬头的调度表相关的子程序,你映射要运行的代码有效命令:

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

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

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