gpt4 book ai didi

perl 解析多个字符串的文件

转载 作者:行者123 更新时间:2023-12-01 06:50:43 30 4
gpt4 key购买 nike

过去两周我一直在学习 perl。我一直在为我的学校项目编写一些 perl 脚本。我需要为多个字符串解析一个文本文件。我搜索了 perl 论坛并获得了一些信息。下面的函数为一个字符串解析一个文本文件并返回一个结果。但是我需要脚本来搜索文件中的多个字符串。

use strict;
use warnings;


sub find_string {
my ($file, $string) = @_;
open my $fh, '<', $file;
while (<$fh>) {
return 1 if /\Q$string/;
}
die "Unable to find string: $string";
}

find_string('filename', 'string');

现在例如,如果文件包含多个带有正则表达式的字符串,如下所示

"testing"
http://www.yahoo.com =1
http://www.google.com=2

我希望函数可以搜索多个字符串,例如

find_string('filename', 'string1','string2','string3');

有人能解释一下我需要怎么做吗。这真的很有帮助

最佳答案

在这里快速浏览一下:

您现在传递文件名和一个字符串。如果传递多个字符串怎么办:

 if ( find_string ( $file, @strings ) ) {
print "Found a string!\n";
}
else {
print "No string found\n";
}


..

sub find_string {
my $file = shift;
my @strings = @_;
#
# Let's make the strings into a regular expression
#
my $reg_exp = join "|" ,@strings; # Regex is $string1|$string2|$string3...

open my $fh, "<", $file or die qq(Can't open file...);
while ( my $line = <$fh> ) {
chomp $line;
if ( $line =~ $reg_exp ) {
return 1; # Found the string
}
}
return 0; # String not found
}

我正要去开会,所以我什至还没有真正测试过这个,但想法就在那里。一些事情:

  • 您想处理字符串中可能是正则表达式字符的字符。您可以使用 quotemeta 命令,或在每个字符串前后使用 \Q\E
  • 考虑使用使用autodie 来处理无法打开的文件。然后,您不必检查您的公开声明(就像我在上面所做的那样)。
  • 有局限性。如果您要搜索 1,000 个不同的字符串,这会很糟糕,但搜索几个应该没问题。
  • 请注意我如何使用标量文件句柄 ($fh)。我不会通过子例程打开文件,而是传入一个标量文件句柄。这将允许您处理主程序中的无效文件问题。这是标量文件句柄的一大优势:它们可以轻松传递给子例程并存储在类对象中。

测试程序

#! /usr/bin/env perl
#

use strict;
use warnings;
use autodie;
use feature qw(say);

use constant {
INPUT_FILE => 'test.txt',
};


open my $fh, "<", INPUT_FILE;

my @strings = qw(foo fo+*o bar fubar);

if ( find_string ( $fh, @strings ) ) {
print "Found a string!\n";
}
else {
print "No string found\n";
}

sub find_string {
my $fh = shift; # The file handle
my @strings = @_; # A list of strings to look for

#
# We need to go through each string to make sure there's
# no special re characters
for my $string ( @strings ) {
$string = quotemeta $string;
}

#
# Let's join the stings into one big regular expression
#
my $reg_exp = join '|', @strings; # Regex is $string1|$string2|$string3...
$reg_exp = qr($reg_exp); # This is now a regular expression

while ( my $line = <$fh> ) {
chomp $line;
if ( $line =~ $reg_exp ) {
return 1; # Found the string
}
}
return 0; # String not found
}
  • autodie 在我无法打开文件时处理问题。无需检查。
  • 请注意,我的open 中有三个参数。这是首选方式。
  • 我的文件句柄是 $fh,它允许我将它传递给我的 find_string 子例程。在主程序中打开文件,我可以在那里处理读取错误。
  • 我遍历我的 @strings 并使用 quotemeta 命令自动转义特殊的正则表达式字符。
  • 请注意,当我在循环中更改 $string 时,它实际上修改了 @strings 数组。
  • 我使用 qr 创建一个正则表达式。
  • 我的正则表达式是 /foo|fo\+\*o|bar|fubar/
  • 有一些错误 例如,字符串fooburberry 将与foo 匹配。你想要那个,还是你想要你的字符串是整个单词?

关于perl 解析多个字符串的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24398654/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com