我想抓住字符串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