这里我尝试使用标准输入读取文件。在我的情况下,标准输入无法打印花括号内容。
我的代码:
#!/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
答案 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
中的字符串被解释为包含正则表达式元字符。