我想讀取一個文本檔案,并將每一行劃分為以下三個變數。每個變數都必須被定義,盡管它可能等于空字串。
$a1code:所有字符,直到并不包括第一個非轉義百分號。如果沒有非escaped的百分號,這就是整行的內容。正如我們在下面的例子中看到的,這也可能是下面兩個變數不為空的一行中的空字串。$a2boundary:第一個非轉義百分號,如果有的話。$a3cmnt:第一個非省略百分號后的任何字符,如果有的話。
下面的腳本完成了這個任務,但是需要幾行代碼,兩個哈希值,以及一個復合的搜索引擎,也就是由|組合的兩個搜索引擎。
復合似乎是必要的,因為第一個子句,
(?<a1code>.*?)(?<a2boundary>(?<!)%)(?<a3cmnt>.*)
不匹配純代碼的行,沒有注釋。
有沒有一個更優雅的方法,使用一個單一的重合詞和更少的步驟?
特別是,有沒有一種方法可以省去%match哈希,并以某種方式
填充% 哈希,并在一個步驟中使用所有三個變數?
#!/usr/bin/env perl
use strict; use warnings;
print join(''/span>, 'perl ', $^V, "
",)。
use Data::Dumper qw(Dumper); $Data::Dumper::Sortkeys = 1;
my $count=0;
while(<DATA>)
{
$count ;
print "$count"/span>;
chomp;
my %match=(
a2boundary=>''/span>。
a3cmnt=>'',
);
print "|$_|
"。
if($_=~/^(?<a1code>.*?)(?<a2boundary>(?<!)%)(?<a3cmnt>.*)|(?<a1code>.*)/)
{
print " from regex:
"。
print Dumper \% ;
%match=(%match,% ,)。
}
else
{
die "no match? coding error, should never get here" ;
}
if(scalar keys % != scalar keys %match)
{
print "來自多行代碼。
"。
print Dumper \%match。
}
print "------------------------------------------
"。
}
__DATA__
這是100/%的文本,下面你會發現一個空行。
abba 5\% %comment 9\% Borgia
%所有評論
%
結果:
perl v5.34.0
1|這是100%的文本和下面你發現一個空行。 |
從regex。
$VAR1 = {
'a1code' => 'This is 100\% text and below you find an empty line. '
};
從多行的代碼。
$VAR1 = {
'a1code' => 'This is 100\% text and below you find an empty line. '。
'a2boundary' => '',
'a3cmnt' => '', '.
};
------------------------------------------
2 ||
來自regex。
$VAR1 = {
'a1code' => ' '
};
從多行的代碼。
$VAR1 = {
'a1code' => ''。
'a2boundary' => '',
'a3cmnt' => '', '.
};
------------------------------------------
3 |abba 5%%comment 9%%Borgia|||。
來自regex。
$VAR1 = {
'a1code' => 'abba 5\% '。
'a2boundary' => '%',
'a3cmnt' => 'comment 9\% %Borgia',
};
------------------------------------------
4|%all comment|
來自regex。
$VAR1 = {
'a1code' => '',
'a2boundary' => '%'。
'a3cmnt' => 'all comment', 'all comment'.
};
------------------------------------------
5 |%|
來自regex。
$VAR1 = {
'a1code' => '',
'a2boundary' => '%'。
'a3cmnt' => '', '.
};
------------------------------------------
uj5u.com熱心網友回復:
你可以使用下面的方法:
my($a1code, $a2boundary, $a3cmnt)=
/
^
( (?: [^\%] | . )* )
(?: (%) (.*) )?
z
/sx。
它不考慮
標籤:%在abc\
