如何使用Perl检查字符串

时间:2017-10-13 14:19:17

标签: perl

我正在尝试替换文件中的特定行。我可以让我的程序运行,但它实际上并没有进行我想要的替换。

这是我的示例文件:

@Configuration
@ComponentScan("it.besmart.eshare.web")
public class WebConfig extends WebMvcConfigurerAdapter{

    public WebConfig(){
        super();
    }

    @Autowired
    CompanySelector companySelector;

    @Autowired
    HttpServletRequest request;

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        Company company = null;
        try {
            company = companySelector.getActualCompany(request);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (company != null){
            messageSource.setBasename("classpath:"+ company.getSlug() + "_messages");
        } else {
            messageSource.setBasename("classpath:messages");
        }
        messageSource.setDefaultEncoding("UTF-8");

        return messageSource;
    }

}

以下是我的代码:

test line 1
test line 2
line to be overwritten
test line 3

我试图以几种不同的方式更改my $origFile = $file_path . "junk\.file"; my $newFile = $file_path . "junk\.file\.backup"; # system command to make a backup of the file system "mv $origFile $newFile"; #opens the files open( my $INFILE, $newFile ) || die "Unable to read $newFile\n"; open( my $OUTFILE, '>' . $origFile ) || die "Unable to create $origFile\n"; # While loop to read in the file line by line while ( <$INFILE> ) { given ($_) { when ("line to be overwritten") { print $OUTFILE "line has been overwritten\n"; } default { print $OUTFILE $_; } } } close($INFILE); close($OUTFILE); 语句无效:

when

但那些只会产生错误。谁知道我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

正如对原始问题的评论中所强调的那样,给定/何时是perl的实验性功能。我个人建议在循环中使用if / else,然后使用字符串相等或正则表达式来匹配要替换的行。一个简单的例子:

use strict;
use warnings;

while(my $line = <DATA>) {
  if ( $line =~ /line to be overwritten/ ) {
    print "Overwritten\n";
  } else {
    print $line;
  }
}

__DATA__
test line 1
test line 2
line to be overwritten
test line 3

这将给出输出:

test line 1
test line 2
Overwritten
test line 3

如果您对正则表达式没有信心,或者字符串保证相同,您也可以使用字符串相等:

...
if ($line eq 'line to be overwritten') {
...

图片的标题说明

在初次打开时,建议使用open的3参数版本来保存意外问题:

open(my $INFILE, '<', $newFile) || die "Unable to read $newFile\n";

(有关详情,请参阅此处:http://modernperlbooks.com/mt/2010/04/three-arg-open-migrating-to-modern-perl.html

严格&amp;警告

另外,建议在代码文件中使用strictwarnings,如上例所示 - 这样可以避免意外错误,例如尝试使用尚未使用过的变量声明和语法错误可能会让你头疼!

实验性功能

perl中的实验性功能是在新的perl版本发布时无法保证向后兼容性的保证。显然,如果你在任何地方都使用相同版本的perl它应该兼容,但如果你更新到另一个主要版本的perl,事情可能会中断。 在这里回答,因为我没有在评论中回答的声誉......

答案 1 :(得分:-1)

一种方法是使用Tie :: File模块。它允许直接替换文件中的数据。在更改原始文件之前,您可以使用当前正在进行的备份。

use strict;
use warnings;
use Tie::File;

my $file = 'test.txt';
tie my @textFile, 'Tie::File', $file, recsep => "\n"  or die $!;
s/line to be overwritten/line has been overwritten/ for @textFile;
untie @textFile;

答案 2 :(得分:-1)

你似乎正在变得比它需要的更复杂 - 一个简单的正则表达式来检查每一行并采取相应的行动应该完成这项工作。

while(<$INFILE>)
{
     chomp($_);
     if /^line to be overwritten$/ )
     {
          print $OUTFILE "line has been overwritten\n";
     }
     else
     {
          print $OUTFILE "$_\n";
     }
}