我需要知道本地主机的网关
我尝试使用系统命令和IP路由表,但是什么也没有。
system("ipconfig | findstr /i "Gateway"")
除了输出是网关,我得到了Bareword found where operator expected at script.pl line 63, near ""ipconfig | findstr /i "Gateway"
(Missing operator before Gateway?)
String found where operator expected at script.pl line 63, near "Gateway"""
syntax error at script.pl line 63, near ""ipconfig | findstr /i "Gateway"
Execution of script.pl aborted due to compilation errors.
答案 0 :(得分:4)
findstring
是没有用的,因为perl是一个出色的grep
引擎...
在Linux下,我会这样做:
my $gw;
open my $ipr,"ip r|";
while (<$ipr>) {
$gw=$1 if /default.*via ([0-9.]+) /;
};
print $gw."\n";
您的问题代表ipconfig
,我认为类似
open my $ipr,"ipconfig /all|";
while (<$ipr>) {
$gw=$1 if /[dD].*faul?t.*: ([0-9.]+) *$/;
};
print $gw."\n";
注意:正则表达式是基于fr.wikipedia和en.wikipedia的 try 。 欢迎反馈!
my $gw;
my $regex='default.*via ([0-9.]+) ';
my $cmd='ip r';
if ($^O =~ "MSWin") {
$regex='[dD].*faul?t.*: ([0-9.]+) *$';
$cmd='ipconfig /all'
};
open my $ipr,$cmd."|";
while (<$ipr>) {
$gw=$1 if /$regex/;
};
print $gw."\n";
这项工作在我的Debian Linux下进行。不知道这是否可以在MSWin下工作... 欢迎反馈!
traceroute
:use Net::Traceroute;
$tr = Net::Traceroute->new(host => "8.8.8.8",max_ttl=>1);
print "Gateway: " . $tr->hop_query_host(1,0) . "\n";
答案 1 :(得分:0)
我看到没有人真正解释过您的问题。
不能在双引号字符串中使用普通的双引号字符。如果您考虑一下,很明显,双引号字符串中的第一个双引号字符将被视为字符串的结尾。
您的代码是这样的:
system("ipconfig | findstr /i "Gateway"")
这被视为双引号字符串("ipconfig | findstr /i"
),后跟一个裸字(Gateway
)和另一个双引号字符串(空字符串-""
)。这永远不会成功编译。
最简单的解决方法是将双引号字符串更改为单引号字符串:
system('ipconfig | findstr /i "Gateway"')
但是,正如其他人指出的那样,当您拥有全部Perl功能时,使用findstr
似乎是一个很奇怪的想法。