我正在尝试捕获字符串cd /a/b/c
并执行以下转换
(作为更大的Perl程序的一部分)。
如果cd /a/b/c
存在,则转换cd /a/b/c
→chdir '/a/b/c'
并执行chdir '/a/b/c'
我可以进行转换;我无法告诉perl
执行我的命令。
答案 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");
}