我如何使用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;
}
答案 0 :(得分:3)
要删除字符串中的最后一个斜杠及其后的所有内容
$string =~ s{.*\K/.*}{};
其中\K
丢弃所有先前的匹配,因此它们不会被“消耗”(在匹配时从字符串中删除),我们不必捕获并放回前一个.*
。有关\K
,请参见“ 环顾断言”。in Extended Patterns in perlre。我们需要.*
的贪婪才能使第一个/
到达最后一个*
。
要删除字符串中的第一个斜杠及其后的所有内容
$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.
我在其中使用modifier /r
进行“ 非破坏性替换”,根据需要返回更改后的字符串(原始字符串保持不变)直接打印到文件。
这将删除最后一个/
及其后的所有内容,即上面的第一种情况;如果需要,请更改为s{/.*}{}r
。
对问题代码的一些注释
使用词法文件句柄并为输出文件打开三个参数,并检查open
调用,就像您对输入文件(在子目录中一样)
总是将外部代码所需的所有内容传递给sub;依靠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
命名不是很有帮助。为变量和函数(以及其他程序元素)选择好名字在编程中非常重要。
答案 1 :(得分:1)
您可以尝试在/
上拆分输入字符串,然后仅在拆分后保留第一部分:
my $input = 'hdkhehfkf/kfkjhoer';
my @parts = split /\//, $input;
print $parts[0];
此打印:
hdkhehfkf
答案 2 :(得分:1)