Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Perl从长列表中提取特定信息_Perl_Parsing_Text - Fatal编程技术网

使用Perl从长列表中提取特定信息

使用Perl从长列表中提取特定信息,perl,parsing,text,Perl,Parsing,Text,我要处理的文件是LDAP提取的结果,但我需要最终将信息格式化为电子表格可以使用的格式 因此,数据如下: DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData displayName: John Doe name: ##userName DataDataDataDataDataDataData

我要处理的文件是LDAP提取的结果,但我需要最终将信息格式化为电子表格可以使用的格式

因此,数据如下:

DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
displayName: John Doe
name: ##userName

DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
displayName: Jane Doe Jr
name: ##userName

DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
displayName: Ted Doe
name: ##userName
我需要导出到的格式是:

firstName lastName userName
firstName lastName userName
firstName lastName userName
其中空格是选项卡,这样我就可以将该文件导入数据库。我在VBScript中有这样做的经验,但我正在尝试切换到使用Perl来尽可能多地管理服务器

我不确定我想要的语法基本上是

while not endoffile{
detect "displayName: " & $firstName & " " & $lastName
detect "name: ##" & $userName

write $firstName tab $lastName tab $userName to file
}
另外,如果有人能给我指出一个专门关于Perl使用的文本解析语法的资源,我将非常感激。我遇到的大多数资源都不是很有用


此外,有些用户名是数字。前导的两个数字仍然需要修剪,但如果有帮助的话,用户名的长度始终为6个字符。

类似的内容应该可以做到这一点——它从stdin读取并输出到stdout,因此您可以使用普通的unix管道来使用文件:

#!/usr/bin/perl

use strict;
use warnings;
use String::Util 'trim';

# set "line ending" to \n\n, to allow slurping by paragraphs:
local $/ = "\n\n";

while (my $line = <>)
{
    chomp $line;

    my ($displayName) = ($line =~ /^displayName: (.+)$/m);
    my ($name) = ($line =~ /^name: ##(.+)$/m);
    trim $displayName;
    trim $name;

    my ($firstName, $lastName) = ($displayName =~ /^([^ ]+) (.+)$/);

    print "$firstName\t$lastName\t$name\n";
}
#/usr/bin/perl
严格使用;
使用警告;
使用字符串::Util'trim';
#将“行结束”设置为\n\n,以允许按段落滑动:
本地$/=“\n\n”;
while(我的$line=)
{
chomp$行;
我的($displayName)=($line=~/^displayName:(.+)$/m);
我的($name)=($line=~/^name:##(.+)$/m);
修剪$displayName;
修剪$name;
我的($firstName,$lastName)=($displayName=~/^([^]+)(.+)$/);
打印“$firstName\t$lastName\t$name\n”;
}
我使用您在下面提供的示例输入进行了测试,如
test.pl
,并得到了输出:

John Doe userName Jane Doe userName Ted Doe userName 无名氏用户名 无名氏用户名 Ted Doe用户名 您可以在$/下阅读段落模式下的slurping,也可以阅读这个SO问题(需要链接)。使用匹配运算符上的m标志启用多行内的匹配—请参阅。

这是我的解决方案

use strict;
use warnings;
my $fh;
my $file_contents;
my @info;
open $fh, '<', "data" or die($!);
local $/ = undef;
$file_contents = <$fh>;

while($file_contents =~ /.ame: (.*?)$(.*?).ame: (.*?)$/smg)
{

   my $displayname = $1;
   my $username = $3;
   $displayname =~ s/^\s+//; #clean off any whitespace from front/back
   $displayname =~ s/\s+$//;
   my ($firstname, $lastname) = split(/\s+/, $displayname); #split on whitespace

   print "$firstname\t$lastname\t$username\n"; #note the tabs
}
使用严格;
使用警告;
我的$fh;
我的$file\u内容;
我的@info;

打开$fh,'脚注:我一直找不到对段落模式的SO引用,尽管我知道
$/
在过去已经讨论过好几次。如果有人找到此链接,请添加评论或将其编辑到问题中-谢谢!这里有一个关于段落解析的问题:@FM:其中一个讨论了设置
local$/=unde--但我确信前一段时间有个问题讨论过将其设置为
“\n\n”
,以便一次阅读段落…啊,段落解析,这是我应该寻找的。谢谢你的回答!在串联中使用未初始化值$firstName在串联中使用未初始化值$lastName我只是在尝试此脚本时不断遇到这些错误。在第8行没有这样的文件或目录,不太确定这里发生了什么。值得注意的是,从单个字符串解析出名字和姓氏字段非常简单。考虑<代码>莎拉·米歇尔·盖拉< /代码>和<代码>法拉·福塞特专业> <代码>。一个正确的解析器(如果可能的话)会知道解析这些名字的正确方法是“Sarah Michelle”、“Gellar”和“Farah”、“Fawcett Majors”。如何处理这些边缘情况取决于您,但您应该确保具有指定的行为。否则,罗伯特·德尼罗和他的朋友会破坏你的软件。