我正在尝试在两个文件之间匹配此电话号码,并且我在堆栈流中找到了此代码; Compare file lines for match anywhere in second file
use strict; #ALWAYS ALWAYS ALWAYS
use warnings; #ALWAYS ALWAYS ALWAYS
use autodie; #Will end the program if files you try to open don't exist
# Constants are a great way of storing data that is ...uh... constant
use constant {
FILE_1 => "a1.txt",
FILE_2 => "a2.txt",
};
my %phone_hash1;
my %phone_hash2;
open my $phone_num1_fh, "<", FILE_1;
while ( my $phone_num = <$phone_num1_fh> ) {
chomp $phone_num;
$phone_hash1{ $phone_num } = 1;
}
close $phone_num1_fh;
open my $phone_num2_fh, "<", FILE_2;
while ( my $phone_num = <$phone_num2_fh> ) {
chomp $phone_num;
$phone_hash2{ $phone_num } = 1;
}
close $phone_num2_fh;
my %in_common;
for my $phone ( keys %phone_hash1 ) {
if ( $phone_hash2{$phone} ) {
$in_common{$phone} = 1; #Phone numbers in common between the two lists
}
}
for my $phone ( sort keys %phone_hash1 ) {
if ( not $in_common{$phone} ) {
print "Phone number $phone is only in the first file\n";
}
}
for my $phone ( sort keys %phone_hash2 ) {
if ( not $in_common{$phone} ) {
print "Phone number $phone is only in " . FILE_2 . "\n";
}
}
for my $phone ( sort keys %in_common ) {
print "Phone number $phone is in both files\n";
}
问题是; 在我的第一个文件中,我需要过滤掉电话号码, 所以,我试图做到这一点;
if ($s1 =~ m/(.*)\s+(.*)\s+(.*)\s+/)
{
my $phone_num=($1."/".$2);
chomp $phone_num;
$phone_hash1{ $phone_num } = 1;
}
我的第二个文件在电话号码前面有一个路径 如alias / a / b / c / 0123456789
而且我不知道如何将其过滤到哈希中,或者过滤掉不需要的东西,以便可以在两个文件之间比较这两个数字。
($phone_hash2{ $phone_num } =~ /.*$str/)
答案 0 :(得分:0)
如果您想从字符串中过滤掉数字,例如alias / a / b / c / 0123456789,则可以使用/(\ d +)/这样的模式,如果您确定“路径”中没有数字
如果您知道数字位于路径的末尾,则可以使用/(\ d +)$ /
答案 1 :(得分:0)
如果前缀在“第二个文件”的内容中始终相同
alias/a/b/c/${phone_number_1}
alias/a/b/c/${phone_number_2}
alias/a/b/c/${phone_number_3}
然后可以通过执行substr
来删除前缀:
my $offset = length("alias/a/b/c/");
while(my $line = <$fh_file>) {
chomp($line);
$line = substr($line, $offset);
}
如果前缀不相同,则由于您提到它们看起来像“路径”,因此我将假定该路径的最后一部分是实际电话号码。所以解决方案很简单:走路径的最后一部分。这也是“最长的子字符串,其中没有任何/
锚定在$ line的末尾”(假定与上面的while循环结构相同):
my ($phone) = $line =~ m{([^/]+)\z};
或者,从不同的角度来看:“将最长的前缀从$ line删除的末尾带有/
,而不是采用$ line的其余部分”:
my $phone = $line =~ s{\A.+/}{}r;
当然,如果电话号码本身可以用简单的方式枚举,例如[0-9]{8}
([0123456789]
集中的8个字符),那么“固定在$ line末尾与电话号码格式匹配的部分”:
my ($phone) = $line =~ m{([0-9]{8})\z};
如果以上都不满足您的情况,那么...我只是在猜测:)