- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用散列映射在数组中搜索单词,如下例所示,但没有找到。下面的代码会将一本书读入@bookArray。然后,我想搜索@bookArray 来找到某个词。书中的单词可以被其他单词无限制地包围。
open( SEARCHWORDS, "< $encoding", $_folder . "searchwords.txt" ) or die("Input file not found.\n");
open( BOOK, "< $encoding", $_folder . "book.txt" ) or die("Input file not found.\n");
while ( $_ = <BOOK> ) {
push @bookArray, $_;
}
my %thebook = map {$_ => 1} @bookArray;
while ( my $searchWords = <SEARCHWORDS> ) {
if (exists $thebook{$searchWords}) {
print "yeppie";
}
}
#example of words in Book "I want to go to the store andbuy some food";
#example of search words "buy";
最佳答案
更新 已阐明目标是识别具有给定单词的句子。
您的 %thebook
中的每个键hash 是书中的整行。因此,当您搜索一个单词的键时,它不存在。
用你已有的词来识别一行的简单方法
foreach my $line (@bookArray)
{
while (my $searchWords = <SEARCHWORDS>)
{
chomp $searchWords;
if ($line =~ /($searchWords)/) {
print "Found $1 in: $line\n";
}
}
}
这是低效的,因为在每一行中搜索所有单词,并且在书籍文件已经处理之后。但对于给定的目标,它可能仍然是可以接受的。
最好翻过来,在阅读该文件时在书中的每一行中查找单词。
use warnings 'all';
use strict;
my $words_file = '...';
my $book_file = '...';
open my $w_fh, '<', $words_file or die "Can't open $words_file: $!";
my @search_words = <$w_fh>;
close $w_fh;
chomp(@search_words);
open my $bk_fh, '<', $book_file or die "Can't open $book_file: $!";
while (my $line = <$bk_fh>)
{
chomp $line;
foreach my $word (@search_words)
{
if ($line =~ /$word/)
{
print "Found $word in line $.: $line\n";
}
}
}
每当找到一个单词时,它就会打印在它出现的每一行上。
您还可以构建书中单词的哈希值,其中每个单词都是一个键,其值是一个arrayref(数组引用),其中包含找到它的行号。
遍历行并将每一行分解为单词,将它们添加为键。对于每个键,将该行的编号 ($.
) 添加到其 arrayref 值。即使在同一行中重复发现该单词,也会添加该数字,这是多行出现的合理记录。如果不需要,这很容易改变。我们还将行存储在数组中。
while (<$bk_fh>) {
push @bookArray, $_;
push @{$book_word{$_}}, $. for split;
}
say "$_ => [ @{$freq{$_}} ]" for sort keys %freq; # print all (long!)
split默认拆分 $_
通过空格,和 <>
运算符默认分配给 $_
.所以for split
遍历行中的单词,做 push ...
对于每个。 $.
是当前正在从 $bk_fh
读取的行的行号.
如果这个词已经被看到并且作为键存在那么push
只需将此行的编号添加到作为该键值的 arrayref。
Perl 的 autovivification 使遇到新词时变得简单。当表达式 $book{$_}
使用新词(在 $_
变量中)自动添加为键。同样,@{$book{$_}}
expression 引用一个 arrayref 作为新词键的值,因此它创建了 arrayref。然后 push
放 $.
到它上面。我们不必首先手动创建这些。
参见 perlreftut供引用和perldsc用于复杂的数据结构。
然后你可以使用exists
来检查每个单词。 , 如果它确实存在,则使用该单词的值打印数组中的行,这是该行在数组中的索引。
原帖
你可以把书中的每一行分解成单词,然后将其输入一个散列,一个大散列
while ( <BOOK> ) {
chomp;
push @bookArray, split;
}
my %thebook = map {$_ => 1} @bookArray; # potentially very big
默认拆分 $_
通过空格,而 <>
默认分配给 $_
.
或者,如果您还想保留整行的数组,请对哈希执行此操作
my @bookArray = <BOOK>;
chomp @bookArray;
my %thebook = map {$_ => 1} map { split } @bookArray; # potentially very big
然后是个别词$searchWords
将(可能)成为 key 。此外,行必须是chomp
-ed 删除换行符。否则有些词会有它,有些则没有。
我想补充一点——你们为什么用这种方式打开文件?关于
my $bookfile = $_folder . 'book.txt';
open my $bk_fh, '<', $bookfile or die "Can't open $bookfile: $!";
此外,是 $_folder
确实是一个包含文件夹名称的变量?对于变量名来说,这是一个冒险的选择。
关于regex - 使用 Perl,使用 HashMap 在数组中搜索单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40010939/
如果我的 Perl 程序使用 Perl 模块,它将如何确定在哪里可以找到包含模块代码的文件? 例如,如果程序包含: use MyModule1; # Example 1 us
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我正在自学 Perl,并且在我的 Windows 8 64 位系统上安装了 Strawberry。 Strawberry 命令行似乎工作正常,我在 C 驱动器上的 Strawberry 文件夹中创建了
我在 Perl 模块 IO::Socket::SSL 中发现了一个错误,我可能会修复它,但是,我担心测试修复。我从 Debian 下载了源码包(因为我打算为它制作一个 Debian 包或补丁)并查看了
我有一个 perl 文件,它使用了两个 perl 模块 A.pm 和 B.pm。 但是在 B.pm 中我需要调用 A.pm 的子程序。即使我在 A.pm 中使用并尝试使用它,我仍然遇到未定义的错误。
有没有办法在 Perl 运行时加载整个模块?我原以为我用 autouse 找到了一个很好的解决方案,但以下代码无法编译: package tryAutouse2; use autouse 'tryAu
过去,我编写过许多 perl 模块,以及不止一些独立的 perl 程序,但我之前从未发布过多文件 perl 程序。 我有一个几乎处于 beta 阶段的 perl 程序,它将被开源发布。它需要一些数据文
我有 1 个 perl 脚本,我们在其中编写了几个子例程。例子: # Try_1.pl main(); sub main{ --- --- check(); } check { -- --} 现在,
似乎 CPAN 上的一些(很多?)模块部分是使用 XS 在 C 中实现的,如果需要,可以回退到纯 perl 实现。虽然这很聪明,但它显然会损害性能,我想知道它是否会发生,以便我可以解决问题。 有没有一
我对 perl 很陌生。我希望我可以从 perl 安装一些软件包,我这样做是这样的: perl -MCPAN -e 'install VM::EC2' 我猜它由于依赖而失败,它显示: Result:
给定一个 Perl 包 Foo.pm,例如 package Foo; use strict; sub bar { # some code here } sub baz { # more
我有一个用 Perl 编写的测试生成器。它生成连接到模拟器的测试。这些测试本身是用 Perl 编写的,并通过其 API 连接到模拟器。我希望生成的代码是人类可读的,这意味着我希望它能够正确缩进和格式化
我正在学习 Perl,非常新的用户。我可以知道这些 Perl 代码之间有什么区别吗? #!/usr/bin/perl & #!/usr/bin/perl -w 最佳答案 那不是 perl 代码,它是
我不认为这是一个重复的问题。这专门针对 Perl 模块附带的脚本。 通常,在安装多个 Perl 版本时,您可以将 perl 可执行文件标记为版本号 (perl5.32),这样它们就可以在 /whate
我有一个在文件中使用 Blowfish 加密的程序和第二个 perl 程序,它提示输入用于将其解密为字符串的密码,我希望不必将解密的源代码写入硬盘驱动器,尽管将它放在内存中并不是真正的问题,因为运行程
有没有人为 Perl 中的惰性求值列表找到了一个好的解决方案?我尝试了很多方法来改变类似的东西 for my $item ( map { ... } @list ) { } 进入懒惰的评估——例如,通
我安装了多个版本的 Perl。 我已经指定了要使用的版本。但是为了验证,我想从 .pl 脚本本身输出 Perl 的版本。 这可能吗? 在 Perl 脚本中解析“perl --version”的输出似乎
人们还经常问“我怎样才能编译 Perl?”而他们真正想要的是创建一个可以在机器上运行的可执行文件,即使他们没有安装 Perl。 我知道有几种解决方案: perl2exe靛蓝之星 它是商业的。我从未尝试
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
我是一名优秀的程序员,十分优秀!