Regex Perl:哈希和正则表达式中的键存在问题
很抱歉发布另一个与我之前发布的问题类似的问题。我意识到我的问题不是很清楚,这可能会导致一些误解的答案。所以我想重新措辞,再问一次 我的任务是读入2个文件(基本配置文件和配置文件)。这两个文件可以有任意数量的行。行的顺序不必按顺序排列。我需要忽略“!”和“^”之后的内容。然而,我被困在忽略“!”和“^”的部分。我能够将每一行存储到散列中的键中(没有“!”或“^”之后的内容),但在比较时失败 例如,如果文件中有一行“hello!123”,我只需要在散列中存储“hello”,并将字符串“hello”与另一个散列中的另一个键进行比较。如果在另一个散列中有一个“hello”键,我需要将其打印出来或放入另一个散列中。我的程序只能从“hello!123”行中输入“hello”,但当它与另一个散列中的另一个键进行比较时,该部分失败 我通过编写另一个简短的程序来检查正则表达式,该程序只接收用户输入,删除“!”和“^”符号后的内容,并与另一个散列的另一个键进行比较 这是我的错误代码:Regex Perl:哈希和正则表达式中的键存在问题,regex,string,perl,file,hash,Regex,String,Perl,File,Hash,很抱歉发布另一个与我之前发布的问题类似的问题。我意识到我的问题不是很清楚,这可能会导致一些误解的答案。所以我想重新措辞,再问一次 我的任务是读入2个文件(基本配置文件和配置文件)。这两个文件可以有任意数量的行。行的顺序不必按顺序排列。我需要忽略“!”和“^”之后的内容。然而,我被困在忽略“!”和“^”的部分。我能够将每一行存储到散列中的键中(没有“!”或“^”之后的内容),但在比较时失败 例如,如果文件中有一行“hello!123”,我只需要在散列中存储“hello”,并将字符串“hello”与
my %common=();
my %different=();
#open config file and load them into the config hash
open CONFIG_FILE, "< script/".$CONFIG_FILENAME or die;
my %config;
while (<CONFIG_FILE>) {
chomp $_;
$_ =~ s/(!.+)|(!.*)|(\^.+)|(\^.*)//;
$config{$_}=$_;
print "_: $_\n";
#check if all the strings in BASE_CONFIG_FILE can be found in CONFIG_FILE
$common{$_}=$_ if exists $base_config{$_};#stored the correct matches in %common
$different{$_}=$_ unless exists $base_config{$_};#stored the different lines in %different
}
close(CONFIG_FILE);
my%common=();
我的%不同=();
#打开配置文件并将其加载到配置哈希中
打开配置文件,“
有人有和我一样的问题吗?您如何解决它?my%common=();
my %common=();
my %different=();
#open config file and load them into the config hash
open CONFIG_FILE, "<", "script/".$CONFIG_FILENAME or die;
my %config;
while (<CONFIG_FILE>) {
chomp;
my ($first,$last) = (split(\!| \^,$_,2);
$config{$first}=$first;
print "_: $first\n";
#check if all the strings in BASE_CONFIG_FILE can be found in CONFIG_FILE
if ( exists $base_config{$first} ) {
$common{$first}=$first; #stored the correct matches in %common
} else {
$different{$first}=$first; #stored the different lines in %different
}
}
close(CONFIG_FILE);
我的%不同=();
#打开配置文件并将其加载到配置哈希中
打开配置文件,“我不确定您的问题出在Sakura上,但我认为可能是您没有在$CONFIG
和$base\u CONFIG
之间找到匹配项。我怀疑这可能是因为前导/尾随空格,建议您编写
while (<CONFIG_FILE>) {
s/[!^].*//; # Remove comments
s/^\s+//; # and clear leading
s/\s+$//; # and trailing whitespace
next if length == 0; # Ignore empty lines
$config{$_} = $_;
print "_: $_\n";
if ( $base_config{$first} ) {
$common{$first} = $first;
}
else {
$different{$first} = $first;
}
}
while(){
删除注释
s/^\s+/#和清除前导
s/\s+$/#和尾随空格
下一步如果长度=0;#忽略空行
$config{$\}=$\;
打印“\u:$\n”;
if($base_config{$first}){
$common{$first}=$first;
}
否则{
$DISTABLE{$first}=$first;
}
}
在比较其值之前,您还需要确保$base\u config
具有相同的处理方法。谢谢您的快速响应!我已修复了拆分附近的语法错误。但是,我仍然会收到与代码相同的错误。>.(拆分(\!\124;\ ^,$\ u2)
是胡说八道,我怀疑你的意思是split/!\124; \^/,$,2;
当它与另一个散列中的另一个键进行比较时,它在“部分失败”中到底是如何失败的?你的意思是每一行都被打印出来了吗?(那是因为打印没有条件。)并且你的正则表达式替换将起作用,但它最好写为s/[!^].*/;
。是的。它现在工作得很好。我没有考虑前导/尾随空格,这导致了错误。谢谢你的帮助!@Sakura我注意到我的代码中有几个错误。首先,可能在数据结尾和注释之间的一行中有空格,会被错误地保留不变;并且其次,删除所有注释和空白后,可能什么也没有留下,空字符串不应作为有效密钥存储。我已修改了我的答案,并敦促您将更改复制到自己的代码中。对于这些错误,我深表歉意。