2010-03-29 86 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。關於這一點的好處是,當你有新的命令時,你不會改變處理循環,而只處理你打算處理的命令。此外,您可以直接從配置構建該調度表。