perl < STDIN>vs $name子字符串搜索-一个有效,另一个无效[已关闭]

4xrmg8kj  于 2023-03-30  发布在  Perl
关注(0)|答案(3)|浏览(131)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
昨天关门了。
Improve this question
我是一个MASM,Perl,Qbasis和HTML的老程序员,但已经脱离它20年了。现在我有一个在线商店,想用Perl再次制作一些我自己的脚本。
所以,现在,我正在搜索一些CSV文件,以找到客户的电子邮件。我的Perl脚本工作正常,如果我使用
my $searchName = 'mchanna@gmail.com';
但如果我想设置它从控制台获取一个值
chomp(my $searchName = <STDIN>);
它找不到它们。这是整个脚本

#!/usr/bin/perl
use strict;
use CGI;  

my @filenames = ("2019 Sales.csv", "2020 Sales.csv", "2021 Sales.csv", "2022 Sales.csv", "2023 Sales.csv" );
my $file = "";
my $count = 0;

my $searchName = 'mchanna@gmail.com';
chomp(my $searchName = <STDIN>);

foreach $file (@filenames) {
    open(FH, '<', $file) or die $!;
    while( my $line = <FH>) {
        if (index(lc($line), lc($searchName)) != -1) {
            $count = $count + 1;
        }
    }
    close(fh);
}
print "$searchName has $count matches found\n";

有什么建议吗?
我尝试了单引号和双引号,在Perl中通过索引、chomp和字符串阅读网页。
以为是因为<STDIN>上的\n,但chomp没有什么区别
我肯定漏掉了什么小东西。

bfnvny8b

bfnvny8b1#

一些意见:

  • 在此脚本中,您没有使用CGI执行任何操作,因此可以放弃use CGI;
  • 每当我遇到输入问题时,我都会回显它,看看我得到了什么。你已经在最后一条print语句中这样做了,但是如果你这样做,它可能会更好:
print "'$searchName' has $count matches found\n";

通过将变量的值放在双引号字符串中的单引号内,可以更容易地查看您是否得到了您所期望的内容。例如,如果值的末尾有额外的空格,您将看到类似于以下内容的内容:

'mchanna@gmail.com ' has 0 matches.
u4vypkhs

u4vypkhs2#

当我在包含mchanna@gmail.com的文件中尝试你的代码时,我发现了这个字符串。因为我们没有看到你的输入,我怀疑电子邮件不在任何这些文件中,或者这不是你实际上作为搜索词的内容。
得到输入后,输出它,这样你就可以看到它是什么:

chomp( my $searchTerm = <STDIN> );
print "Search term is <$searchTerm>\n";

如果你没有发现问题所在,你可能需要更加努力:

use Devel::Peek qw(Dump);
Dump( $searchTerm );

额外的东西

除此之外,你正在做很多Perl可以为你做的工作。不要自己处理所有的文件,玩大小写等等,让Perl来做:

my $searchName = shift @ARGV;

my $count = 0;
while( <> ) {
    $count++ if m/\Q$searchName/i;
}

print "$searchName has $count matches found\n";

你可以这样运行:

% perl program.pl mchanna@gmail.com *.csv

这并不是说你需要一行代码,但是同样的快捷方式可以让你轻松完成。BEGINEND在开始和结束时分别执行一次操作:

$ perl -lne '$c++ if m/\Q$s/} BEGIN{$s=shift} END{print qq($s found $c time)' mchanna@gmail.com *.csv
mchanna@gmail.com found 1 time

但实际上,看起来将这些东西导入数据库可能会更好。像SQLite这样简单的东西可以工作(在电子邮件上使用索引)。然后数据库可以处理您正在做的几乎所有事情,如果您有大量数据,则会更快。

1zmg4dgp

1zmg4dgp3#

至少有一部分问题是不是$searchname已经用my初始化了两次?
my $searchName = 'mchanna@gmail.com'; chomp(my $searchName = <STDIN>);
Def按照@Packy的建议在测试时打印/回显输入。
但是请尝试不使用第二个my的相同脚本。

相关问题