码:
@all_matches = grep
{
! ( $seensentence
{
$_->[0] .'-'. $_->[1] .'-'. $_->[5]
}
++ )
}
@all_matches;
Run Code Online (Sandbox Code Playgroud)
目的:此代码从阵列中删除某些元素的重复项,@all_matches即AoA.
我完全崩溃的尝试(?? ?? ??我不确定的地方):
Grep返回@all_matches返回true 的元素.
哈希的关键%seensentence是三个元素?? 的@all_matches.由于散列只能有唯一键,所以第一次通过它的值从undef(0)递增到1.下一次,它是一个定义的值,但是!只有当它的undef(相关的唯一值)时,grep才会返回它用那个元素).
我的问题:
(1)如何{$_->[0] .'-'. $_->[1] .'-'. $_->[5]}++变成HoH?
我被告知这是实现它的另一种(惯用的)方式.在黑暗中刺伤将是:
( {$_->[0] => 0,
$_->[1] => 0,
$_->[5] => 0} )++
Run Code Online (Sandbox Code Playgroud)
(1b)因为我不明白原作是如何做我想要的.我读到的-bareword是相同的,"-bareword"所以我尝试过:{"$_->[0]" . "$_->[1]". "$_->[5]"}它看起来完全相同.我仍然不明白:它是将每个元素分别视为一个键(a)(如一个键数组)还是它(b)正确:所有同时(因为.将它们连接成一个字符串)或者是它(c) )不做我认为的事情?
(2)这是什么意思: …
好吧,不知道在哪里问这个,但我是初学程序员,使用Perl.我需要创建一个数组的数组,但我不确定是否更好地使用数组/哈希引用,哈希数组或哈希数组等.
我需要一系列匹配: @totalmatches
每个匹配包含6个元素(字符串):
@matches = ($chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument1, $argument2)
Run Code Online (Sandbox Code Playgroud)
我需要将每个元素推入@matches数组/ hash/reference,然后将该数组/散列/引用推送到@totalmatches数组中.
基于搜索文件并基于满足标准选择字符串来找到匹配.
质询
你会使用哪种数据结构?
你可以将数组推入另一个数组,就像将元素推入数组一样吗?这是一种有效的方法吗?
你可以同时推动所有6个元素,还是必须进行6次单独推送?
使用2-D时,要循环使用:
foreach(@totalmatches){foreach(@matches){...}}
谢谢你的建议.
我试图将我的代码转换为一系列子程序,使其更加模块化.下面代码中的条件语句是我无法合并到子例程中的.
next unless ( $sentblock =~ /\[sent. \d+ len. \d+\]: \[.+\]/ ); #1#
( $sentence, $sentencenumber ) = &sentence_sentnum_chptnum($sentblock); #SUBROUTINE
if ( $sentence =~ /\~\s(\d*F*[\.I_]\w+)\s/ ) { #2#
$chapternumber = $1;
$chapternumber =~ tr/./_/;
}
next
unless ( $sentence =~ /\b\Q$search_key\E/i #3#
&& $sentence =~ /\b\Q$addkey0\E/i
&& $sentence =~ /\b\Q$addkey1\E/i );
next
if ( defined($exc0) #4#
&& length($exc0)
&& $sentence =~ /\b\Q$exc0\E\b/i );
next
if ( defined($exc1) #5#
&& length($exc1)
&& $sentence =~ /\b\Q$exc1\E\b/i );
Run Code Online (Sandbox Code Playgroud)
到目前为止的子程序:
sub sentence_sentnum_chptnum {
my …Run Code Online (Sandbox Code Playgroud) 工作代码:
if ( $check1 eq $search_key ...
Run Code Online (Sandbox Code Playgroud)
以前的'buggy'代码:
if ( $check1 =~ /$search_key/ ...
Run Code Online (Sandbox Code Playgroud)
单词(in $check1和$search_key)应该是相同的,但为什么第二个单词不会一直返回true?这些有什么不同?
$check1是通过分裂获得的.$search_key要么在("word")之前输入,要么在运行时输入:(<>),然后将它们传递给子程序.
还有一个问题是,我可以在没有任何隐藏问题的情况下转换以下内容吗?
if ($category_id eq "subj") {
Run Code Online (Sandbox Code Playgroud)
我希望能够说:=~ /subj/所以"主题"仍然是真的.
提前致谢.
我已经在地图,tr和引用上阅读了教程和perldoc,但这个代码对于像我这样的初学者Perl用户来说有点太高级了.
print map $_->[1],
sort {
$a->[0] cmp $b->[0] ##first element of the array
or $a->[1] cmp $b->[1] }
map [ tr/"MATCH"/"MATCH"/, $_ ], @allmatches;
Run Code Online (Sandbox Code Playgroud)
所以我特别需要的是:$ _指的是什么(未定义?)
包括地图在内的最后一行做了什么?
我还不太了解$ a和$ b概念.他们指的是什么?@allmatches的第一个和下一个元素?
另外,所有逗号(在地图之后)做什么?如果这就像Schwartzian变换那么好,因为我还不明白,尽管阅读.
这是我的想法:将
未定义的标量映射为数组的引用(哪个?)同时调用第二个元素:[1].它首先根据"MATCH"的出现次数排序我的@allmatches数组,然后按字母表排序.通过参考的第二张地图对我来说很粗糙(地图在一步中做了很多); tr返回次数.第二个"MATCH"没用,但为什么呢?
额外奖励:有什么可以替换tr ///来排序更多,比如这是否可能:tr/MATCH#\ d + // ??
我在尝试编写一个搜索引擎时遇到了麻烦,该搜索引擎将一个单词的所有变形视为相同的基本单词.
虚拟式(如 可能,关键的东西来完成,我希望它是)
例如,使用" 启用 ",我不希望将" 启用 "和" 启用 "打印为单独的条目.所有这三个都应该算作相同的基本单词,即动词启用.
我可以使用哈希来阻止打印重复项:
unless ($seenmatches{ $headmatches[$l] }++)
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?在下面的评论中解释.
这并不能阻止复数/过去继续下去.有没有办法做到这一点,或者一些完全不同的方法,也许一个涉及正则表达式和/或替换,然后是一个unsub后来?
我不能用替换修改单词,因为那时打印不会正确打印出来.虽然我还没有进入舞台,但最终我还想包括不规则的过去时期[ ᴇᴅɪᴛᴏʀɴᴏᴛᴇɴᴏᴛᴇ:还有不规则名词?]以及
我不知道你还有什么需要回答我的问题,所以请让我知道任何我无意中遗漏的内容,并且我会填写任何遗漏的内容以帮助更清楚.
好的,所以我已经阅读了不同的方法,但我只是想检查一下我的方式是否有一个看不见的问题,或者是否有更好的方法(也许是grep?).
这是我的工作代码:
#!usr/bin/perl
use strict;
use warnings;
my $chapternumber;
open my $corpus, '<', "/Users/jon/Desktop/chpts/chpt1-8/Lifeprocessed.txt" or die $!;
while (my $sentence = <$corpus>)
{
if ($sentence =~ /\~\s(\d*F*[\.I_]\w+)\s/ )
{
$chapternumber = $1;
$chapternumber =~ s/\./_/;
}
open my $outfile, '>>', "/Users/jon/Desktop/chpts/chpt$chapternumber.txt" or die $!;
print $outfile $sentence;
}
Run Code Online (Sandbox Code Playgroud)
该文件是一本教科书,我已经记新的章节:~ 1.1 Organisms Have Changed over Billions of Years 1.1.或~ 15Intro ...或~ F_14我想这是一个新的文件的开头:chpt1_1.txt(或其他chpt15Intro等....).当我找到下一章分隔符时,哪个结束.
1选项:也许不是逐行,只是像这样得到整个块?:
local $/ = "~";
open...
while...
next unless ($sentenceblock =~ /\~\s([\d+F][\.I_][\d\w]+)\s/);
.... …Run Code Online (Sandbox Code Playgroud) 好的,所以不确定 apple.stackexchange 是否是一个更好的地方,但我需要一些有关此代码的帮助:
目标:要求用户输入循环应重复的次数。如果他们以错误的格式输入,请发送反馈
问题如果我输入一个小数,它只是把它当作一个整数并且仍然有效,我该如何防止这种情况,或者用另一种方式检查它?
set correctEntry to false --initially assume false
repeat while correctEntry is false
--Let user put how many times it loops
set textToDisplay to "How often should this repeat?"
display dialog textToDisplay default answer "2.4"
set reps to text returned of the result
--Detailed check/feedback if they input wrong
try
--Begins as string, try making it an integer
set reps to reps as integer --coercion will should only work with integer
set correctEntry to …Run Code Online (Sandbox Code Playgroud) 我有这种排序方法,它基本上只是基本的思维过程,而不是使用Perl的功能,偶尔它不会发生我想要的行为(错过了一些频率计数).我想知道是否有更好的方法对此进行排序.
目标根据找到的匹配频率对数组进行排序.
示例数组数组
##ADDED 1 to END of EACH ROW, just because my sort forced me too!!!
my @all_matches = (["chpt10_2", "sent. 2", "alice", "nsubj", "animals", "protect"],
["chpt12_1", "sent. 54", "bob", "nsubj", "cells", "protect"],
["chpt25_4", "sent. 47", "carol", "nsubj", "plants", "protect"],
["chpt34_1", "sent. 1", "dave", "nsubj", "cells", "protect"],
["chpt35_1", "sent. 2", "eli", "nsubj", "cells", "protect"],
["chpt38_1", "sent. 1", "fred", "nsubj", "animals", "protect"],
["chpt54_1", "sent. 1", "greg", "nsubj", "uticle", "protect"]
);
Run Code Online (Sandbox Code Playgroud)
目前的排序
@all_matches = sort {lc($a->[4]) cmp lc($b->[4])} @all_matches;
my …Run Code Online (Sandbox Code Playgroud) 这已被转移到一个测试用例在这里.
我想从2个子程序返回数组(必须是引用),但是用作条件语句的正则表达式并不像我希望的那样工作.我试过用一个,但我觉得这会更容易.
需要明确的是,我的目标是有排序的匹配(阵列@all_matches),然后添加另一个阵列(@all_pronoun_matches)排序方式相同,但在添加结束.
这是@pronoun_matches子程序:
my ($line, $verbform, $chapternumber, $sentencenumber, $sentence) = @_;
my @matches;
my @pronoun_matches;
return unless ($line =~ /(\w+)\((\w+)\-\d+\,\s(\w+)\-\d+\)/); #2nd repeat check
$grammar_relation = $1;
$argument1 = $2;
$argument2 = $3;
return if (($argument1 =~ /^$argument2/i)||($argument2 =~ /^$argument1/i));
foreach my $pronoun (@stopListNoun)
{
if ((lc $pronoun eq lc $argument1) || (lc $pronoun eq lc $argument2))
{
push (@pronoun_matches, $chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument2, $argument1) if ($argument2 =~ …Run Code Online (Sandbox Code Playgroud)