Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使perl能够识别未知模式?_Perl - Fatal编程技术网

如何使perl能够识别未知模式?

如何使perl能够识别未知模式?,perl,Perl,我有一个文件,例如file1: tree_apple tree_banana tree_orange tree_cherry 我想制作一个脚本,识别文件中项目之间的一致命名结构。对于文件:1,一致的命名结构将是树。因此,我需要一个perl脚本来读取文件并将一致的命名结构保存为变量,比如$pattern。假设文件中的所有项共享一致的命名结构。如果一个列表中只有两个项目具有模式,那么这无关紧要,如果模式不存在于所有项目中,那么它就不是一致的命名结构 注意:这些文件确实有一些结构。它们仅仅是字母数字

我有一个文件,例如file1:

tree_apple
tree_banana
tree_orange
tree_cherry
我想制作一个脚本,识别文件中项目之间的一致命名结构。对于文件:1,一致的命名结构将是树。因此,我需要一个perl脚本来读取文件并将一致的命名结构保存为变量,比如$pattern。假设文件中的所有项共享一致的命名结构。如果一个列表中只有两个项目具有模式,那么这无关紧要,如果模式不存在于所有项目中,那么它就不是一致的命名结构

注意:这些文件确实有一些结构。它们仅仅是字母数字字符,但可以通过分组来分隔,例如,水果被分割成一组后

<>也注意:一致的命名结构并不总是在开始,也可以在中间或结尾。

如果我们有一个文件,如file2:

mask_protection
gloves_protection
armour_protection
boots_protection
现在一致的命名结构是protection,请注意它现在的结尾

或者如果我们有一个文件,比如file3:

123_red_456
123_blue_456
123_green_456
123_yellow_456
现在,始终如一的命名结构已经出现。是123和456

或最终可能在中间,如细胞在细胞中4:

Apple_cell_phone
Blood_cell_donation
Prison_cell_inspection
Excel_cell_row

那么,有没有一种方法可以通过perl查看文件并找到一致的模式呢?

如果我们可以依赖于在示例中发现的u使用的一致性,那么这只是一个在u上拆分并找到具有公共值的列的问题

我的@模板; 如果定义了my$行={ chomp$行; @模板=split/uu/,$line,-1; 定义时,$line={ chomp$行; my@fields=split/u/,$line,-1; @模板==@字段 或者\$ARGV\line$处的字段数不一致。\n; 对于我的$i 0..$模板{ 如果定义了$template[$i]&&$template[$i]ne$字段[$i]{ $template[$i]=未定义; } } } } 说join!,map{$\/'*'}@template ;; 输出:

美元/份文件1 树_* 美元/份文件2 *_保护 美元/份文件3 123_*_456 美元/份文件4 *_细胞_*
如果我们不能依赖示例中的u使用的一致性,那么您需要解释为什么file3的模式不是123*e*456。

如果我们可以依赖示例中的u使用的一致性,那么这只是一个拆分u并查找具有公共值的列的问题

我的@模板; 如果定义了my$行={ chomp$行; @模板=split/uu/,$line,-1; 定义时,$line={ chomp$行; my@fields=split/u/,$line,-1; @模板==@字段 或者\$ARGV\line$处的字段数不一致。\n; 对于我的$i 0..$模板{ 如果定义了$template[$i]&&$template[$i]ne$字段[$i]{ $template[$i]=未定义; } } } } 说join!,map{$\/'*'}@template ;; 输出:

美元/份文件1 树_* 美元/份文件2 *_保护 美元/份文件3 123_*_456 美元/份文件4 *_细胞_*
如果我们不能依赖于在您的示例中发现的u使用的一致性,那么您需要解释为什么file3的模式不是123*e*456。

您好,谢谢,这正是我想要的。不过,我确实对你的代码有几个问题。对于split命令,我注意到你把-1作为限制。这到底是干什么的?难道不就是没有限制的工作吗?另外,我知道我们正在创建两个数组,然后比较它们,但是在if语句中,您将$template[$I]设置为undef if$template[$I]ne$fields[$I]。将其设置为undef的目的是什么?最后,我不确定这在join函数中是什么意思。你能给我解释一下吗?很抱歉,我对perl还是一个新手。另外,我想知道是否也有一种方法可以抓取组的一部分。例如,如果文件1包含树\苹果树\香蕉树\桔树\樱桃树。模式仍然是tree,即使apple和cherry在树中有一个额外的s字符,Re将其设置为undef?的目的是什么,以将其标识为非固定字段。嗨,谢谢,这正是我要找的。不过,我确实对你的代码有几个问题。对于split命令,我注意到你把-1作为限制。这到底是干什么的?难道不就是没有限制的工作吗?另外,我知道我们正在创建两个数组,然后比较它们,但是在if语句中,您将$template[$I]设置为undef if$template[$I]ne$fields[$I]。将其设置为undef的目的是什么?最后,我不确定这在join函数中是什么意思。你能给我解释一下吗?很抱歉,我对perl还是一个新手。另外,我想知道是否也有一种方法可以抓取组的一部分。例如,如果文件1包含树\苹果树\香蕉树\桔树\樱桃树。尽管苹果和樱桃在树上有一个额外的s字符,但模式仍然是树,p是什么 将其设置为undef?的目的是将其标识为非固定字段。