perl - 如何删除以斜杠开头的部分字符串
问题描述
我想如何使用 perl 脚本在斜线后删除所有字符串?假设我有如下输入文件
例如:
hdkhehfkf/kfkjhoer
082734708/92740234
我想要的输出是
hdkhehfkf
082734708
这是我的代码
#!/usr/bin/perl
use strict;
use warnings;
my $file = "file.sv";
my $dirname = "../../../folder/";
open ( OUTFILE, ">uncompile_test.txt" );
main ();
close OUTFILE;
sub main {
my @array;
open( my $fh, "<", "$dirname/$file")
or die "Failed to open file: $!\n";
while(<$fh>) {
push @array, $_;
}
close $fh;
print OUTFILE " ", @array;
}
解决方案
删除字符串中的最后一个斜杠及其后面的所有内容
$string =~ s{.*\K/.*}{};
where\K
丢弃所有以前的匹配,这样它们就不会被“消耗”(从字符串中),所以我们不必捕获并放回第一个.*
. 请参阅perlre的扩展模式中的“环视断言” 。为了达到最后的目的,我们首先需要它。\K
.*
/
*
删除字符串中的第一个斜杠及其后面的所有内容
$string =~ s{/.*}{};
我使用{}{}
分隔符不必/
在模式中转义。
对于您的示例,其中任何一个都有效。它们都更改$string
,然后您可以打印。
(如果这是关于使用路径,那么我建议使用一些好的模块)
这个问题得到了实质性的编辑,添加了代码
为文件的每一行运行它,并将输出保存在另一个文件中
open my $fh_out, '>', $outfile or die "Can't open $outfile: $!";
open my $fh, '<', $file or die "Can't open $file: $!";
while (<$fh>) {
print $fh_out s{.*\K/.*}{}r;
}
close $_ for $fh, $fh_out.
我使用修饰符 /r
, 表示“非破坏性替换”,返回更改后的字符串(原始保持不变),就像直接打印到文件一样。
这将删除/
上面的第一个案例;s{/.*}{}r
如果需要,请更改为。
对问题中的代码的一些评论
总是把它需要的所有东西都从外部传递给一个子;依靠 sub 从周围范围“查看”变量是完全危险的。在你的情况下,这意味着
sub process_file_to_output { # find a suitable name my ($dir, $file, $fh_out) = @_; ... }
你会称它为
process_file_to_output($dirname, $file, $outfile_handle);
$outfile_handle
如果您希望在调用者中打开输出文件,那么输出文件的(词法!)文件句柄在哪里。命名一个子
main
不是很有用。为变量和函数(以及其他程序元素)选择好的名称在编程中非常重要。对输出文件使用词法文件句柄和三参数 open,并检查
open
调用,就像您对输入文件所做的一样(在子文件中)
推荐阅读
- javascript - 在将道具传递给儿童之前反应检查 api 请求
- javascript - 进度条作为里程碑
- java - 如何将文件项拆分为数组?
- android - Spinner 现在确实在某些屏幕中显示选定的值 - 我应该如何设计它?
- flutter - 是否可以在 Windows/Linux 中为 ios 远程编译颤振代码
- php - $_SERVER['HTTP_TOKEN'] 和 $_SERVER['HTTP_ACCEPT']
- date - Fullcalendar Qtips 日期格式
- python - unittest 后的命令不执行
- javascript - 未调用 JavaScript 警报弹出框
- ios - 背景上的 SCNNode 大图像导致崩溃