为什么我的标准输入不考虑使用perl的花括号?

时间:2017-05-10 05:59:32

标签: perl

这里我尝试使用标准输入读取文件。在我的情况下,标准输入无法打印花括号内容。

我的代码:

#!/usr/local/bin/perl
use strict;
use warnings;

my $file = 'file.txt';
open my $fh, "<", $file
    or die "Could not open '$file': $!";
chomp(my @files = <$fh>);
close $fh
    or die "Coould not close '$file' $!";
while (my $stdin = <>) {
    chomp $stdin;
    if ( grep { $stdin eq $_ } @files ) {
        print "@files\n";
        last
    }
    else {
        print "There is no word in the $file\n";
        last;
    }
}

FILE.TXT:

{data1}
data2
data3
{data4}

文件执行:

perl t.pl
data1
There is no word in the file.txt

1 个答案:

答案 0 :(得分:1)

自从几个小时前我第一次看到这个问题以来,这个问题就已被编辑了。最初,关键线看起来像这样:

if ( grep { $stdin eq $_ } @files ) {

这是永远不会起作用的,因为你正在给它&#34; data1&#34;作为输入,没有一行使用eq匹配该字符串。你有一行包含&#34; data1&#34;,但因为它包围了&#34; {&#34;和&#34;}&#34;,字符串不同 - 'data1 eq {data1}显然是错误的。

您现在已将该行更改为:

if ( grep { $stdin && $_ } @files ) {

这很奇怪。此检查会询问问题&#34; $stdin$_是否包含真值?&#34;。这几乎肯定是真的。我真的不确定应该实现的改变。

您的问题实际上并没有说明您在此尝试做什么。但是我猜你想要匹配,如果任何一行包含输入的字符串(但如果它不构成整行,那就没关系)。在这种情况下,您需要进行正则表达式检查,并且您的代码行应该是:

if ( grep { /\Q$stdin/ } @files ) {

注意:我已根据评论中的建议添加了\Q。这是一个好主意,因为它可以防止@files中的字符串被解释为包含正则表达式元字符。