使用perl grep从段落中获取带有匹配字符串的行的一部分

时间:2014-03-14 11:28:42

标签: regex perl grep

我有一个数组,其内容如下:

print Dumper(\@jsession);

$VAR1 = [
'<html><body><form name = \'form\' id=\'form\' method = \'POST\' action =        \'/mySite.jsp\'><input type = hidden name = \'phpSessionID\' value =   \'GZbtXhI9JiQ**\'><input type = hidden name = \'LoggedUserName\' value =  \'MyName\'><!--input type = submit name = \'button\' value ='\'goAhead\'--></form>    <script language = \'JavaScript\'> document.getElementById(\'form\').submit();</script>  </body></html>
];

我的目标是将phpSessionID值放在变量说$ session,即

$session=GZbtXhI9JiQ**;

我必须使用Perl grep执行此操作。我尝试了下面的内容虽然不多,但

$session=grep(/^<.*phpSessionID.*>$/,@jsession);

我刚接触RegEx并且正在努力做到这一点。

2 个答案:

答案 0 :(得分:1)

我假设您需要来自value元素的input属性name属性为phpSessionID。这个。

<input type = hidden name = 'phpSessionID' value =   'GZbtXhI9JiQ**'>

您应该使用针对该作业的模块来解析HTML,例如HTML::TreeBuilder。使用正则表达式无法可靠地完成它,因为元素的可能格式存在很大差异。

答案 1 :(得分:0)

Borodin建议使用HTML::TreeBuilder或其他一些解析模块绝对是可行的方法。

因为我有一段时间没有使用该模块,所以我决定继续使用你提供的html实现他的建议。我稍微重新格式化了html,以便更容易阅读,但这不会影响此代码的功能:

use HTML::TreeBuilder;

use strict;
use warnings;

my $root = HTML::TreeBuilder->new_from_content(<DATA>);

if (my $element = $root->look_down('_tag' => 'input', 'name' => 'phpSessionID')) {
    print "Value is " . $element->attr('value') . "\n";
} else {
    warn "phpSessionID not found";
}

__DATA__
<html>
<body>
<form name = 'form' id='form' method = 'POST' action =        '/mySite.jsp'>
<input type = hidden name = 'phpSessionID' value =   'GZbtXhI9JiQ**'>
<input type = hidden name = 'LoggedUserName' value =  'MyName'>
<!--input type = submit name = 'button' value =''goAhead'-->
</form>    
<script language = 'JavaScript'>
document.getElementById('form').submit();
</script>
</body></html>

输出

Value is GZbtXhI9JiQ**