我有一个这样的字符串:
Reporting EXE1 BASE,Normal
我需要为每个单词获取一个var:
$info = "Reporting";
$host = "EXE1";
$device = "BASE";
$status = "Normal";
事实上,我看到功能“拆分”可能是一个很好的用途,但我不明白使用的模式。
答案 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;