为什么不能对@数组进行m//查找?

为什么不能对@数组进行m//查找?

定义数组:
@ifconfig_nic = `ifconfig -a`;
下面有一个多行匹配的情况:
($my_ip) = @ifconfig_nic =~ /inet\s(\d+\.\d+\.\d+\.\d+)\s/m;
chomp $my_ip;

root@solaris01 # ifconfig e1000g0
e1000g0: flags=9000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4,NOFAILOVER> mtu 1500 index 2
        inet 3.3.3.10 netmask ffffff00 broadcast 3.3.3.255
        groupname myipmp
        ether 0:c:29:c3:d3:9a

但是运行时却失败,说:
Applying pattern match (m//) to @array will act on scalar(@array)

因为我需要进行多行匹配,出现这个错误搞得我没办法,于是乎:
                        open MY_TMP_FILE, "> $my_host_dir/ifconfig.out";
                        print MY_TMP_FILE "@ifconfig_nic";
                        close MY_TMP_FILE;
                        chomp ($ifconfig_nic = `cat $my_host_dir/ifconfig.out`);
                        ($my_ip) = $ifconfig_nic =~ /inet\s(\d+\.\d+\.\d+\.\d+)\s/m;
                        chomp $my_ip;

这样才可以。

但是这样就进行了I/O操作了,我想避免这种操作,所以我想能不能有一种方法,直接用数组进行匹配(包含多行匹配)?

或者能不能有一种方法,将一个数组的所有值,赋给一个$标量?

map

my @ifconfig_nic = `ifconfig -a`;
my @my_ip = map { /inet\s+(\d+\.\d+\.\d+\.\d+)\s/ } @ifconfig_nic;
print join("\n", @my_ip), "\n";


你第一行直接改成

$ifconfig_nic = `ifconfig -a`;

不就行了, 何必这么麻烦
落叶季节,思念季节
返回结果是根据上下文来的, 你如果用标量变量保存结果, 就会吧所有的输出保存在一个标量变量里面
落叶季节,思念季节
是啊,在本地执行我可以这样去改,但是,我的脚本更多的是用tenet,到远程主机去取数据的:
                        if ($my_telnet == 1) {
                                @my_result = $telnet -> cmd("/bin/ksh -c \"export LANG=$my_lang;ifconfig $my_nic\" ");
                                & clear_prompt;
                        }        elsif ($my_local == 1) {
                                @my_result = `ifconfig $my_nic`;
                        }

所以我必须先把结果保存到@数组里面,然后再去做一些处理。
这个方法经测试,是可以的,谢谢了!


$my_result = jion ("\n" , @my_result);

可以 "将一个数组的所有值,赋给一个$标量"
落叶季节,思念季节
这个方法好,这样就跟本地执行没有区别了!

谢谢两位!
拜读一下。。。。。。。。。。