小编Jon*_*Jon的帖子

理解代码:Hash,grep for duplicatelicates(修改为检查多个元素)

码:

@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

6
推荐指数
1
解决办法
345
查看次数

Perl:初学者.我应该使用哪种数据结构?

好吧,不知道在哪里问这个,但我是初学程序员,使用Perl.我需要创建一个数组的数组,但我不确定是否更好地使用数组/哈希引用,哈希数组或哈希数组等.

我需要一系列匹配: @totalmatches

每个匹配包含6个元素(字符串):

@matches = ($chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument1, $argument2)
Run Code Online (Sandbox Code Playgroud)

我需要将每个元素推入@matches数组/ hash/reference,然后将该数组/散列/引用推送到@totalmatches数组中.

基于搜索文件并基于满足标准选择字符串来找到匹配.

质询

  1. 你会使用哪种数据结构?

  2. 你可以将数组推入另一个数组,就像将元素推入数组一样吗?这是一种有效的方法吗?

  3. 你可以同时推动所有6个元素,还是必须进行6次单独推送?

  4. 使用2-D时,要循环使用:

    foreach(@totalmatches){foreach(@matches){...}}

谢谢你的建议.

perl

5
推荐指数
2
解决办法
292
查看次数

帮助转换为子程序

我试图将我的代码转换为一系列子程序,使其更加模块化.下面代码中的条件语句是我无法合并到子例程中的.

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)

perl

5
推荐指数
1
解决办法
118
查看次数

Perl:当=〜没有时,为什么eq会工作?

工作代码:

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/所以"主题"仍然是真的.

提前致谢.

perl

4
推荐指数
2
解决办法
381
查看次数

Perl:有人可以解释这段代码吗?它涉及map,sort,tr和references.(改进的Schwartzian变换)

我已经在地图,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 + // ??

perl

3
推荐指数
2
解决办法
528
查看次数

如何找到基本的,未反思的单词进行搜索?

我在尝试编写一个搜索引擎时遇到了麻烦,该搜索引擎将一个单词的所有变形视为相同的基本单词.

  1. 所以对于动词这些都是相同的词根,:
    • 号码/人(例如 am; is; are)
    • 紧张/情绪,如过去或未来时态(例如 是;是;将会)
    • 过去分词(例如 曾经过 ; 曾经)
    • 现在分词和动名词(例如 正在 ; 没有被滑稽; 早期小于重要正确的)
    • 虚拟式( 可能,关键的东西完成,我希望它)⁠⁠⁠

  2. 然后对于名词,单数形式和复数形式都应该算作相同的基本单词[ ᴇᴅɪᴛᴏʀɴᴏᴛᴇɴᴏᴛᴇ:这经常被称为单词的引用形式.]

例如,使用" 启用 ",我不希望将" 启用 "和" 启用 "打印为单独的条目.所有这三个都应该算作相同的基本单词,即动词启用.

我可以使用哈希来阻止打印重复项:

unless ($seenmatches{ $headmatches[$l] }++)
Run Code Online (Sandbox Code Playgroud)
  1. 有人可以解释一下吗?在下面的评论中解释.

  2. 这并不能阻止复数/过去继续下去.有没有办法做到这一点,或者一些完全不同的方法,也许一个涉及正则表达式和/或替换,然后是一个unsub后来?

我不能用替换修改单词,因为那时打印不会正确打印出来.虽然我还没有进入舞台,但最终我还想包括不规则的过去时期[ ᴇᴅɪᴛᴏʀɴᴏᴛᴇɴᴏᴛᴇ:还有不规则名词]以及

我不知道你还有什么需要回答我的问题,所以请让我知道任何我无意中遗漏的内容,并且我会填写任何遗漏的内容以帮助更清楚.

perl search nlp stemming lemmatization

2
推荐指数
1
解决办法
997
查看次数

根据正则表达式,第二意见将较大的文件拆分为小文件

好的,所以我已经阅读了不同的方法,但我只是想检查一下我的方式是否有一个看不见的问题,或者是否有更好的方法(也许是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)

perl

2
推荐指数
1
解决办法
1422
查看次数

初学者:重复 while 循环和错误

好的,所以不确定 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)

applescript

1
推荐指数
1
解决办法
3546
查看次数

在2D阵列中按频率排序的更好方法是什么?

我有这种排序方法,它基本上只是基本的思维过程,而不是使用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)

sorting perl

1
推荐指数
1
解决办法
314
查看次数

根据停止列表从子例程返回2个数组

这已被转移到一个测试用例在这里.

重做:

我想从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)

perl

0
推荐指数
1
解决办法
113
查看次数

标签 统计

perl ×9

applescript ×1

lemmatization ×1

nlp ×1

search ×1

sorting ×1

stemming ×1