open my $fh, "<", $fp or die "can't read open '$fp': $OS_ERROR";
while (<$fh>)
{
$line=''; #Initialize the line variable
$line=$_; #Reading a record from a text file
print "Line is $line\n"; #Printing for confirming
(@arr)=split('\|',$line);
$line获取以下用竖线分隔的字符串(通过打印$line值确认):
Vanilla Cake $3.65 New Offering|Half pound Vanilla Cake||Cake with vanilla, cream and cheese
然后将该记录拆分并提取到特定的数组元素中:
(@arr)=split('\|',$line);
$arr[0]得到香草蛋糕$3.65
,$arr1得到半磅香草蛋糕
,$arr[2]保持空/NULL
,$arr[3]得到香草、奶油和芝士蛋糕
现在我检查$arr[0]是否包含价格值。匹配的模式是一些文本(香草蛋糕
),然后是美元符号($),接着是一个或多个数字(这种情况下是3
),小数点是可选的 - 可能存在或可能不存在,然后小数点后面可以有一个或多个数字(在这种情况下是.65
)。
使用以下正则表达式:if ($arr[0]=~ /(.*?)(\$\d+(?:\.\d+)?)/)
{
print "match1 is $1, match2 is $2, match3 is $3, match4 is $4\n";
}
问题在于$1、$2、$3、$4 - 所有匹配模式的值都打印为NULL/EMPTY。我认为这是因为$符号是字符串$ arr [0]的一部分。
我猜测,由于$3.65的值,它将$3部分(小数点前)视为变量并尝试替换它,而$3为空。因此,正则表达式匹配正在发生,但值提取可能失败,因为整个字符串可能被解释为Vanilla Cake .65,而不是Vanilla Cake $3.65(这是我的猜测)
可能,这就是为什么正则表达式匹配和提取失败的原因。
我还在某个地方读到过,它可能依赖于变量初始化($line或$arr [0]作为单引号或双引号)-我对这种依赖关系一无所知(这就是为什么像上面那样包括所有代码的原因)。 $line每次从文件中读取一条记录,因此需要在每次迭代时进行初始化。
我尝试了在变量中转义美元符号和Perl中转义美元符号的麻烦解决方案中提供的解决方案,但无法使其正常工作。 在https://regex101.com/r/FQjcHp/2/上创建正则表达式的其他尝试也没有帮助。
请问有人可以告诉我如何使用正确的正则表达式代码从上述字符串中获取“Vanilla Cake”和“$3.65”的值吗?
附注:添加了一个在线编译器运行的截图,其中相同的代码可以正常工作并正确捕获$值。但不知何故,在我的程序中它没有捕获到。
![enter image description here](https://istack.dev59.com/7SsRO.webp)
$3
和$4
将始终为空。 - Shawn