我需要帮助将以下字符串拆分为 (Date, ID, msecs)May 26 09:33:33 localhost archiver: saving ID 0191070818_1462647213_489705 took 180 msec
我只想要第一个下划线之前的 ID 的第一部分。
所以这就是我希望输出的样子May 26 09:33:33, 0191070818, 180
我无法弄清楚在正则表达式中放入什么
use strict;
use warnings;
my $data = 'May 26 09:33:33 localhost archiver: saving ID 0091070818_1432647213_489715 took 180 msec';
my @values = split('/[]/', $data);
foreach my $val (@values) {
print "$val\n";
}
exit 0;
最佳答案
好的。这种拆分是行不通的——因为你使用了单引号,字符串是按字面使用的。由于它不会出现在您的示例文本中,因此它根本不执行任何操作。
Split 根据字段分隔符“剪切”一个字符串,这可能不是您想要的。例如。
split ( ' ', $data );
会给你:
$VAR1 = [
'May',
'26',
'09:33:33',
'localhost',
'archiver:',
'saving',
'ID',
'0091070818_1432647213_489715',
'took',
'180',
'msec'
];
鉴于您的字符串并没有真正像那样正确地“字段化”,我建议采用不同的方法:
你需要从中选择你想要的东西。假设您没有混入一些奇怪的记录:
my $data = 'May 26 09:33:33 localhost archiver: saving ID 0091070818_1432647213_489715 took 180 msec';
my ($time_str) = ( $data =~ m/^(\w+ \d+ \d{2}:\d{2}:\d{2})/ );
my ($id) = ( $data =~ m/(\d+)_/ );
my ($msec) = ( $data =~ m/(\d+) msec/ );
print "$time_str, $id, $msec,\n";
注意 - 您可以组合您的正则表达式模式(如某些示例所示)。我这样做是希望简化和澄清正在发生的事情。正则表达式匹配应用于
$data
(因为 =~
)。括号中的“匹配”元素 ()
然后提取并“返回”以插入左侧的变量中。(注意 - 您需要在括号中包含 'my ( $msec)',因为这样会使用该值,而不是测试结果 (true/false))
关于regex - 在 Perl 中使用正则表达式拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31520056/