Perl 以 (312) 555-1212 格式匹配并提取 phone 数字

Perl match and extract phone number with (312) 555-1212 format

试图让 perl 识别并提取文件中具有某种奇怪格式的字符串中的 phone 数字:

my $str = 'Phone:

(312) 555-1212 _
';

我试过这个解决方案,但它最终从字符串中提取了所有数字:

my @all_nums = $element =~ /(\d+)/g; 
  
 if (@all_nums) {
        
    my $ph = join('-', @all_nums);
    print "PHONE NO: $ph\n"; 
        
    push(@elements_found, $ph);
            
}

非常感谢任何帮助。

为数字格式尝试更精确的正则表达式:

my @all_nums = $element =~ /\((\d+)\) (\d+)-(\d+)/g; 
  
 if (@all_nums) {
        
    my $ph = join('-', , , );
    print "PHONE NO: $ph\n"; 
        
    push(@elements_found, $ph);
            
}

下面的演示代码片段逐行读取 DATA 块并提取 phone(如果行中存在),否则跳至读取下一行。如果在该行中找到 phone 数字,则将其打印在屏幕上。

use strict;
use warnings;
use feature 'say';

my $re = qr/(\(\d{3}\) \d{3}\-\d{4})/;

while( <DATA> ) {
    next unless /$re/;
    say "--  --";
}

__DATA__
Phone:

(312) 555-1212 _

Call customer service at (328) 371-9302 for an assistance

输出

-- (312) 555-1212 --
-- (328) 371-9302 --

以下代码示例将 DATA 块读取到变量 $data 中,然后借助 正则表达式 提取所有 phone 将数字放入数组 @phones,然后将它们打印在屏幕上。

use strict;
use warnings;
use feature 'say';

my $re = qr/(\(\d{3}\) \d{3}\-\d{4})/;

my $data = do { local $/; <DATA>; };
my @phones = $data =~ /$re/g;

say for @phones;

__DATA__
Phone:

(312) 555-1212 _

Call customer service at (328) 371-9302 for an assistance

输出

(312) 555-1212
(328) 371-9302

注意:验证 phone 数字的任务比这些代码示例中演示的更复杂