首页 > 解决方案 > 如何删除以斜杠开头的部分字符串

问题描述

我想如何使用 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;   
}

标签: perl

解决方案


删除字符串中的最后一个斜杠及其后面的所有内容

$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调用,就像您对输入文件所做的一样(在子文件中)


推荐阅读