我正在尝试从SNMP查询创建的数组中提取接口。
我想创建一个类似THIS的数组:
my @array = ( "Gig 11/8",
"Gig 10/1",
"Gig 10/4",
"Gig 10/2");
目前看起来像这样:
my @array =
( "orem-g13ap-01 Gig 11/8 166 T AIR-LAP11 Gig 0",
"orem-g15ap-06 Gig 10/1 127 T AIR-LAP11 Gig 0",
"orem-g15ap-05 Gig 10/4 168 T AIR-LAP11 Gig 0",
"orem-g13ap-03 Gig 10/2 132 T AIR-LAP11 Gig 0");>
我正在做这个:
foreach $ints (@array) {
@gig = substr("$ints", 17, 9);
print("Interface: @gig");
确实有效,但主机名[orem-g15ap-01]并不总是保持相同的长度,具体取决于网站。我需要提取单词“Gig”加上接下来的6个字符。我不知道这样做的最佳方式是什么。
我是perl的新手但是尝试了。感谢
答案 0 :(得分:1)
foreach $ints (@array) {
$ints =~ s/(Gig.{6})/$1/g;
}
答案 1 :(得分:1)
# "I need to extract the word "Gig" plus the next 6 characters."
# This looks like a fixed-with file format, so consider using unpack.
foreach ( @lines ) {
my( $orem, $gig, $rest ) = unpack 'a17 a9 a*';
print "[$gig]\n";
}
如果它没有固定 - 格式化,那么你需要找出文件规范是什么,然后可能使用正则表达式,如:
my( $orem, $gig, $rest ) = m/(\S+)\s+(.{9})(.*)/;
但如果没有适当的文件规范,这在一般情况下不起作用。
答案 2 :(得分:1)
所以你想要第二和第三个领域。
my @array = map { /^\S+\s+(\S+\s\S+)/s } @source;
答案 3 :(得分:0)
这个就像ikegami的,但我建议如果你知道你想要的东西看起来,那么一定要指明那个。因为这是在列表上下文中完成的,所以任何与规范不匹配的字符串都会返回一个空列表 - 或者被忽略。
my @results = map { m!(\bGig\s+\d+/d+)! } @array;