我试图从perl中的文本文件中提取一些数据。我的文件看起来像这样
Name:John
FirstName:Smith
Name:Alice
FirstName:Meyers
....
我希望我的字符串看起来像John Smith
和Alice Meyers
我尝试过这样的事情,但是我被困住了,我不知道如何继续
while (<INPUT>) {
if (/^[Name]/) {
$match =~ /(:)(.*?)(\n) /
$string = $string.$2;
}
if (/^[FirstName]/) {
$match =~ /(:)(.*?)(\n)/
$string = $string.$2;
}
}
我尝试做的是,当我匹配Name或FirstName以复制到:
和\n
之间的内容时,我感到困惑的是$1
和$2
< / p>
答案 0 :(得分:1)
这会将你的名字和名字放在哈希中:
use strict;
use warnings;
use Data::Dumper;
open my $in, '<', 'in.txt';
my (%data, $names, $firstname);
while(<$in>){
chomp;
($names) = /Name:(.*)/ if /^Name/;
($firstname) = /FirstName:(.*)/ if /^FirstName/;
$data{$names} = $firstname;
}
print Dumper \%data;
答案 1 :(得分:0)
通过perl one-liner,
$ perl -0777 -pe 's/(?m).*?Name:([^\n]*)\nFirstName:([^\n]*).*/\1 \2/g' file
John Smith
Alice Meyers
答案 2 :(得分:0)
while (<INPUT>) {
/^([A-Za-z])+\:\s*(.*)$/;
if ($1 eq 'Name') {
$surname = $2;
} elsif ($1 eq 'FirstName') {
$completeName = $2 . " " . $surname;
} else {
/* Error */
}
}
您可能想要添加一些错误处理,例如确保Name始终后跟FirstName,依此类推。
答案 3 :(得分:0)
$ 1 $ 2 $ 3 .. $ N,这是正则表达式中()的捕获结果。
如果你这样做,你就不能避免使用类似$ 1的变量。
my ($matched1,$matched2) = $text =~ /(.*):(.*)/
my $names = [];
my $name = '';
while(my $row = <>){
$row =~ /:(.*)/;
$name = $name.' '.$1;
push(@$names,$name) if $name =~ / /;
$name = '' if $name =~ / /;
}
`而(小于&GT;){
} `
答案 4 :(得分:-1)
open (FH,'abc.txt');
my(%hash,@array);
map{$_=~s/.*?://g;chomp($_);push(@array,$_)} <FH>;
%hash=@array;
print Dumper \%hash;