gpt4 book ai didi

regex - PERL - 使用 txt 文件,并提取不同变量中的数据

转载 作者:行者123 更新时间:2023-12-04 12:30:38 28 4
gpt4 key购买 nike

我需要处理 .txt 文件,并按文件名中存储的名称和日期进行过滤。

目前我实现了以下目标:

my $dir = "t-files\/";
chdir($dir);
foreach $files (glob('*.txt')) {
($sname) = split(/_/, $files);
#($sdate) = "still under work"
print "\nSwitch Name: $sname - Date: still under work";
}

文件示例名称:"s-ar-ar55g-1_20140911-09.txt"| “s-ar-ar55g-1_20141027-09.txt” |

使用这个脚本我有以下输出:

D:\_perl>test_01.pl

Switch Name: s-ar-ar55g-1 - Date: still under work
Switch Name: s-ar-ar55g-1 - Date: still under work
Switch Name: s-ar-ar55g-1 - Date: still under work
Switch Name: s-ar-ar55g-1 - Date: still under work
Switch Name: s-ar-ar55g-1 - Date: still under work
Switch Name: s-ar-ar55g-1 - Date: still under work
Switch Name: s-ar-ar55g-1 - Date: still under work
Switch Name: s-ar-ar55g-1 - Date: still under work
Switch Name: s-ar-ar55g-1 - Date: still under work
D:\_perl>

我的意图是从文件中提取日期字符串“20140911”,并存储到一个新变量“sdate”中

通过这种方式,我需要有两个变量,所以我可以比较名称和日期

是否可以直接从txt文件名中提取年月日这样的“20140911”?

最佳答案

总能用简单的正则表达式解析这样的字符串

my $file = 's-ar-ar55g-1_20140911-09.txt';

my ($sname, $date) = $file =~ /( [^_]+ ) _ ( [0-9]{8} )/x;

/x修饰符使其忽略模式中的空格(和换行符,并使用 # 表示注释),以便我们可以使其更具可读性。至于模式,我在字符类 ^ 中使用否定( [] )与 [^_] , 匹配 _ 以外的任何字符,以及以下 +意味着必须至少有一个这样的字符。这样匹配到第一个字符的字符串 _ .

这是被捕获的,因为周围有() ,必须重复 8 次的数字的模式也是如此,[0-9]{8} .返回两个捕获的模式,并分配给 $sname$date .看教程perlretut对于初学者,或者你最喜欢的 Perl 好书。

注意我声明了my $sname ,以及所有其他引入的变量。这可以通过 strict pragma 强制执行,并且您必须始终启用 warnings当然也是如此。


split你使用的是一个很好的工具,但这里还有一些事情要做

my ($sname, $date) = split /_/, $file;  
# Now need to remove the trailing `-1.txt` from $date
($date) = split /-/, $date, 2;
# or, with a regex
# $date =~ s/[^-]+\K.*//; # remove the first - and all after it

第二个参数中的第三个参数 split , 2 , 告诉 split一起返回两个元素。所以这就是第一个 - 之前的内容然后是一个包含所有内容的字符串。

我们需要()周围$date执行list context否则它会强加一个标量上下文,并会被分配返回列表的元素数 ( 2 )。

显然比基本的正则表达式先使用更多的工作和考虑。

另一种方式,进一步插入这个论点,将是 split_-然后根据需要组装零件

my @parts = split /[_-]/, $file;
my ($sname, $date) = ( join('-', @parts[0..3]), $parts[4] );

现在我们还有那个 @parts变量四处漂浮,据说不需要,所以让我们避免命名空间污染

my ($sname, $date) = do {
my @parts = split /[_-]/, $file;
join('-', @parts[0..3]), $parts[4];
};

(现在 @parts ,在 do block 内被声明为词法 my,在它之外不存在。)

当字符串的一部分需要分析和处理时,这是处理字符串的标准方法,但与那个简单的正则表达式相比,它在这里显然有点矫枉过正。

关于regex - PERL - 使用 txt 文件,并提取不同变量中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69339743/

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