我想抓住字符串cd /a/b/c
并执行以下转换 (作为更大的Perl程序的一部分)。如何告诉perl执行一段生成的Perl代码?
如果cd /a/b/c
存在,那么转换cd /a/b/c
→ chdir '/a/b/c'
和执行chdir '/a/b/c'
我可以做转换;我不能告诉perl
执行我的命令。
我想抓住字符串cd /a/b/c
并执行以下转换 (作为更大的Perl程序的一部分)。如何告诉perl执行一段生成的Perl代码?
如果cd /a/b/c
存在,那么转换cd /a/b/c
→ chdir '/a/b/c'
和执行chdir '/a/b/c'
我可以做转换;我不能告诉perl
执行我的命令。
如果您想查找的目录事先已知。
$str = "blah blah cd /a/b/c blah";
if ($str =~ /cd \/a\/b\/c/){
print "found\n";
chdir("https://stackoverflow.com/a/b/c");
}
我在想这样的事情: $ 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
#!/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.
你真正想要的是一个调度表。当你遇到一个命令,像cd
,你抬头的调度表相关的子程序,你映射要运行的代码有效命令:
%dispatch = ( cd => sub { chdir($_[0]) }, ... ); while(<>) { my($command, @args) = split; if(exists $dispatch{ $command }) { $dispatch{ $command }->(@args); } }
我有这样的事情的几个扩展示例在Mastering Perl。关于这一点的好处是,当你有新的命令时,你不会改变处理循环,而只处理你打算处理的命令。此外,您可以直接从配置构建该调度表。
你能指定一般你*捕捉*吗?一个任意的shell命令?那为什么用Perl来执行它? – reinierpost 2010-03-30 17:49:03