如何删除以斜杠开头的字符串的一部分

时间:2019-06-11 06:25:46

标签: 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;   
}

3 个答案:

答案 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)

使用substitution operator

表达

'hdkhehfkf/kfkjhoer' =~ s|/.*||r

返回字符串

'hdkhehfkf'