perl 基于字符串输入阅读文件

8ehkhllq  于 2023-01-02  发布在  Perl
关注(0)|答案(3)|浏览(204)

我目前正在用Perl编写一个程序,我 * 希望 * 它做的是接受用户的输入(在我的例子中是一个字符串),读取一个文件,在文件中找到包含该输入的条目,然后打印。
这就是我目前为止在这个特定子例程中所拥有的代码,其中这段代码是:

print "What is your Sun Sign?\n";
open ( my $sun, '<', 'sunsigns.txt' ) or die "I couldn't reach the file. Please try again.";
while (my $sun_out = <STDIN>) {
    if ($sun_out =~ /[\w$sun]/) {
        print $sun;
    }
}

当我这么做的时候,它会给我这个:

GLOB(0x1db5f8)

我已经到了极限。我觉得我已经试过了我在谷歌上能找到的所有东西。如果有人能至少给我指出正确的方向,请吧。

31moq8wy

31moq8wy1#

下面是在Perl中执行此操作的常用方法。
首先,从STDIN获取输入字符串。
然后,打开输入文件,遍历所有行,查找输入字符串。找到字符串后,打印包含该字符串的整行。

use warnings;
use strict;

print "What is your Sun Sign?\n";
my $sun = <STDIN>;
chomp $sun;

open (my $fh, '<', 'sunsigns.txt') or die "I couldn't reach the file. Please try again.";
while (<$fh>) {
    if (/$sun/) {
        print;
    }
}

另请参见perlintro

rxztt3cl

rxztt3cl2#

给定此文件:

$ cat file
♈ Aries (Ram): March 21–April 19.
♉ Taurus (Bull): April 20–May 20.
♊ Gemini (Twins): May 21–June 21.
♋ Cancer (Crab): June 22–July 22.
♌ Leo (Lion): July 23–August 22.
♍ Virgo (Virgin): August 23–September 22.
♎ Libra (Balance): September 23–October 23.
♏ Scorpius (Scorpion): October 24–November 21.

你可以这样做:

#!/usr/bin/perl

use strict; use warnings; 

print "Enter Sun Sign: ";
my $sign = <STDIN>;
chomp $sign;

open ( my $sun, '<', '/tmp/file' )or die "I couldn't reach the file. Please try again.";

while (my $line=<$sun>) {
    chomp $line;
    print $line if ($line=~/\b$sign\b/);
}

测试:

Enter Sun Sign: Virgo
♍ Virgo (Virgin): August 23–September 22.
xu3bshqb

xu3bshqb3#

人们已经回答了关于任务的问题,但我想指出为什么你会得到你所做的输出。
首先,你在print中使用了错误的变量。因为$sun是一个文件句柄,并且这是你给予print的唯一参数,它输出该对象的文本表示。这就是为什么你得到GLOB(...)。我通常在结尾用h命名我所有的句柄。对于一个文件,通常是$fh$dh表示目录句柄,等等。这样,当我在错误的地方使用这些名称时,它们就会突出出来。
但是,调用print的各种方法有点烦人,因为没有任何参数的print使用主题变量$_

print; # outputs $_

添加一个文件句柄作为第一个参数并不会将$_输出到该文件句柄,我对此只是有点恼火,但我已经克服了。

print $fh;  # GLOB(...)

你必须自己加上这个论证,但中间不要用逗号(出于我省略的原因):

print $fh $_;

如果您使用了逗号,则问题将返回:

print $fh, $_;  GLOB(...)...

相关问题