проблема с созданием perl-скрипта для имитации команды linux ifconfig

У меня есть задание, в котором я должен создать сценарий Perl в Linux для имитации команды ifconfig. Эта команда в основном показывает вам информацию о ваших сетевых интерфейсах. Я уже создал программу, но несколько строк вызывают у меня некоторые проблемы, я был бы признателен, если бы кто-нибудь мог исправить код для меня. Ошибки, которые я получаю, говорят, что $get_iface_data requires an explicit package name at line 8, однако я не знаю, как это объявить.

#!/usr/bin/perl
use strict;
use warnings;
use Net::Int::Stats;
use Net::Ifconfig::Wrapper;

my $Iface   = $ARGV[0];
my $rx_packets  = $get_Iface_data->value($Iface, 'rx_packets');
my $Iface_Info = Net::Ifconfig::Wrapper::Ifconfig('list', '', '', '');
print "\tether ". $Iface_Info->{$Iface}{'ether'}."\n";

Мое задание в основном требует, чтобы я получил интерфейс в качестве входных данных и отобразил информацию об этом интерфейсе, как это сделала бы команда ifconfig. Я также использовал два пакета, Net::Int::Stats и Net::Ifconfig::Wrapper. Единственная разница между моим сценарием и командой ifconfig заключается в том, что моему сценарию потребуется интерфейс в качестве параметра.


person user218001    schedule 17.04.2013    source источник
comment
Прежде всего, вы должны сообщить нам, какое сообщение об ошибке вы получили. Вы даже не используете $get_Iface_data, и я думаю, вы не можете вызвать для него какой-либо метод. Строки не являются объектами в Perl, но строка — это то, что вы получаете от STDIN.   -  person matthias krull    schedule 18.04.2013
comment
Я добавил полученную ошибку и исправил свой код   -  person user218001    schedule 18.04.2013


Ответы (2)


Ну и где ты определил $get_Iface_data?

$foo->bar — это синтаксис вызова метода. Это означает, что $foo — это своего рода объект, а bar — это метод, который можно использовать для этого объекта.

Вы понимаете объектно-ориентированное программирование и как его использует Perl? По Perl есть отличное руководство, которое поможет вам начать работу.

Это делается для того, чтобы вы не могли использовать конкретный метод (например, подпрограмму), кроме как для объекта этого класса. Из этого фрагмента кода и того, что указано в вашей ошибке, вы никогда не определяли $get_Iface_data, поэтому вам нужно его определить. В этом случае вам нужно создать объект:

my $get_Iface_data = Net::Int::Stats->new();

Теперь вы можете использовать различные Net::Int::Stats методы для объекта %get_Iface_data:

my $rx_packets  = $get_Iface_data->value($Iface, 'rx_packets');
person David W.    schedule 17.04.2013
comment
Использование неинициализированного значения $int в компиляции регулярного выражения в /usr/local/share/perl/5.14.2/Net/Int/Stats.pm, строка 113. Использование неинициализированного значения $int в хеш-элементе в /usr/local/share/ perl/5.14.2/Net/Int/Stats.pm, строка 157. Использование неинициализированного значения $Iface в хеш-элементе в ./test2.pl, строка 11. Использование неинициализированного значения в конкатенации (.) или строки в ./test2. pl строка 11. эфир - person user218001; 18.04.2013
comment
@user218001 user218001, когда вы запускали скрипт, вы передавали интерфейс в командной строке, то есть perl test2.pl eth0? - person imran; 18.04.2013
comment
@ user218001 — Вы столкнулись с использованием неинициализированного значения $Iface в хеш-элементе в ./test2.pl, строка 11. Откуда $Iface получает свою ценность? Видишь этого my $Iface = $ARGV[0]? Вы передаете имя интерфейса в программу при ее запуске? Как Имран уже прокомментировал? - person David W.; 18.04.2013

Вам просто не хватает строки, в которой вы создаете объект Net::Int::Stats:

#!/usr/bin/perl
use strict;
use warnings;
use Net::Int::Stats;
use Net::Ifconfig::Wrapper;

my $Iface   = $ARGV[0];
my $get_Iface_data = Net::Int::Stats->new();
my $rx_packets  = $get_Iface_data->value($Iface, 'rx_packets');
my $Iface_Info = Net::Ifconfig::Wrapper::Ifconfig('list', '', '', '');
print "\tether ". $Iface_Info->{$Iface}{'ether'}."\n";
person imran    schedule 17.04.2013