拆分以仅获取Perl中的字符

时间:2016-09-20 09:22:16

标签: perl parsing split

我有一个这样的字符串:

Reporting EXE1 BASE,Normal

我需要为每个单词获取一个var:

$info = "Reporting";
$host = "EXE1";
$device = "BASE";
$status = "Normal";

事实上,我看到功能“拆分”可能是一个很好的用途,但我不明白使用的模式。

4 个答案:

答案 0 :(得分:4)

我更喜欢使用全局正则表达式模式匹配而不是split。这样你可以指定你感兴趣的字符而不是你要丢弃的字符,如果你的字符串恰好以分隔符开头,那么就没有虚假的初始空字段的可能性

看起来你想挑出"字"字符,大写和小写字母,十进制数字和下划线字符。那里有一个内置字符类\w,因此查找匹配\w+的所有序列应该为您找到数据

这是一个示例程序

use strict;
use warnings 'all';

my $s = 'Reporting EXE1 BASE,Normal';

my ( $info, $host, $device, $status ) = $s =~ /\w+/g;

print qq{\$info   = "$info"\n};
print qq{\$host   = "$host"\n};
print qq{\$device = "$device"\n};
print qq{\$status = "$status"\n};    

输出

$info   = "Reporting"
$host   = "EXE1"
$device = "BASE"
$status = "Normal"

如果您想允许比\w匹配更多的字符,那么您可以使用

my ( $info, $host, $device, $status ) = $s =~ /[^\s,]+/g;

匹配既不是空格也不是逗号的字符序列

鉴于您的样本数据结果相同,但我无法确定您的真实数据是什么样的

答案 1 :(得分:2)

使用Comparable将字符串拆分为逗号并空白

答案 2 :(得分:1)

您可以尝试使用此代码。

my $str = "Reporting EXE1 BASE,Normal";
my @fields = split /\s|,/, $str;
my $info = $fields[0];
my $host = $fields[1];
my $device = $fields[2];
my $status = $fields[3];
print "$info\n";
print "$host\n";
print "$device\n";
print "$status\n";

或更紧凑的版本 -

my $str = "Reporting EXE1 BASE,Normal";
my ( $info, $host, $device, $status ) = split /[\s,]/, $str ;
print "$info\n";
print "$host\n";
print "$device\n";
print "$status\n";

答案 3 :(得分:1)

无需将数据存储在数组中。直接创建列表并为其指定变量名称。

my $string = "Reporting EXE1 BASE,Normal";

my ($info ,$host,$device,$status) = split(/\s|,/,$string);

print "$info ,$host,$device,$status";

否则你可以使用模式匹配

my ($info ,$host,$device,$status) = $string =~m/(\w+)/g;