小编Mik*_*ke 的帖子

如何使用Perl合并重叠元素?

我已经学会了如何使用以下代码删除Perl中的重复项:

my %seen = ();
my @unique = grep { ! $seen{ $_}++ } @array;
Run Code Online (Sandbox Code Playgroud)

但是,如果我想合并重叠的部分呢?有没有像上面代码那样直接完成工作的简单方法?

例如,一些输入文件看起来像这样:

Anais Nin   :  People living deeply have no fear of death.
Pascal      :  Wisdome sends us back to our childhood.
Nietzsche   :  No one lies so boldly as the man who is indignant. 
Camus       :  Stupidity has a knack of getting its way. 
Plato       :  A good decision is based on knowledge and not on numbers. 
Anais Nin   :  We don't see things …

perl

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

为什么我不能打开Perl的readdir返回的文件?

嗯,我知道这是另一个新手问题,但我非常沮丧,我希望再次开悟.在你们的指导下,我已经学会了如何使用glob函数来读取目录中每个文件的内容.现在我正在尝试readdir-foreach组合做同样的事情,但我一直收到"无法打开文件:权限被拒绝"错误.为什么会发生与管理员相同的目录,相同的文件和相同的文件.有人可以告诉我我做错了什么吗?谢谢.

以下代码使用glob函数,它可以工作:

#! perl
my $dir = 'f:/corpus/';
my @files = glob "$dir/*";
foreach my $file (@files) {
open   my $data, '<',"$file" or die "Cannot open FILE";
while(<$data>) {
...}
Run Code Online (Sandbox Code Playgroud)

以下代码失败,错误消息显示"无法打开文件:权限被拒绝".但为什么?

#! perl
my $dir = 'f:/corpus/';
opendir (DIR,'f:/corpus/') or die "Cannot open directory:$!";
my @files=readdir(DIR);
closedir DIR;
foreach my $file (@files) {
open   my $data, '<',"$file" or die "Cannot open FILE:$!";
while(<$data>) {
...}
Run Code Online (Sandbox Code Playgroud)

perl readdir

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

使用utf8编码的Perl脚本,它可以打开编码为GB2312的文件名吗?

我不是在谈论用utf-8或非utf-8编码和东西读取文件内容.这是关于文件名.通常我将Perl脚本保存为系统默认编码,在我的情况下为"GB2312",我不会有任何文件打开问题.但是出于处理目的,我现在有一些以utf-8编码保存的Perl脚本文件.问题是:这些脚本无法打开名称由"GB2312"编码编码的字符组成的文件,我不喜欢重命名文件的想法.

有没有人碰巧有处理这种情况的经验?总是感谢任何指导.

编辑

这是用于演示我的问题的最小化代码:

# I'm running ActivePerl 5.10.1 on Windows XP (Simplified Chinese version)
# The file system is NTFS

#!perl -w
use autodie;

my $file = "./??.txt"; #the file name consists of two Chinese characters
open my $in,'<',"$file";

while (<$in>){
print;
}
Run Code Online (Sandbox Code Playgroud)

如果以"ANSI"编码保存,则此测试脚本可以运行良好(我假设ANSI编码与用于显示中文字符的GB2312相同).但如果保存为"UTF-8"则不起作用,错误信息如下:

Can't open './???.txt' for reading: 'No such file or directory'.

在此警告消息中,"娴嬭瘯"是无意义的垃圾字符.

更新

我尝试首先将文件名编码为GB2312但它似乎不起作用:(这是我尝试的:

#!perl -w
use autodie;
use Encode;

my $file = "./??.txt";
encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";

while (<$in>){
print;
}
Run Code Online (Sandbox Code Playgroud)

我目前的想法是:我的操作系统中的文件名是测试.txt,但编码为GB2312.在Perl脚本中,文件名与人眼看起来相同,仍然是测试.txt.但对于Perl来说,它们是不同的,因为它们具有不同的内部表示.但是我不明白为什么当我已经将Perl中的文件名转换为GB2312时问题仍然存在,如上面的代码所示.

更新 …

perl filenames encoding utf-8

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

为什么这段代码不符合我的意思?

$w = 'self-powering';
%h = (self => 'self',
      power => 'pau?',
      );
if ($w =~ /(\w+)-(\w+)ing$/ && $1~~%h && $2~~%h && $h{$2}=~/?$/) {
    $p = $h{$1}.$h{$2}.'ri?';
      print "$w:"," [","$p","] "; 
}
Run Code Online (Sandbox Code Playgroud)

我期待输出

self-powering: selfpau?ri?
Run Code Online (Sandbox Code Playgroud)

但我得到的是:

self-powering: [ri?]
Run Code Online (Sandbox Code Playgroud)

我的猜测是代码有问题

$h{$2}=~/?$/
Run Code Online (Sandbox Code Playgroud)

好像我用的时候

$h{$2}!~/?$/
Run Code Online (Sandbox Code Playgroud)

Perl会做我的意思,但为什么我不能得到"自我动力:selfpauәriŋ"?我究竟做错了什么?有任何想法吗?

感谢任何意见/建议/指针:)

regex perl hash

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

当找到匹配项时,如何打印上一行和下一行空行之间的所有行?

我试图提出一个解决方案,但是徒劳无功.任何指导将不胜感激.

_data_
mascot
friend
ocean
\n
parsimon
**QUERY**
apple
\n
jujube
\n
apricot
maple
**QUERY**
rose
mahonia
\n
Run Code Online (Sandbox Code Playgroud)

....鉴于搜索关键字是QUERY,它将输出:

parsimon
**QUERY**
apple

apricot
maple
**QUERY**
rose
mahonia
Run Code Online (Sandbox Code Playgroud)

我编写的代码不能按我的意愿运行:

#!/usr/bin/perl

use strict; 
use warnings;

open my $fh, '<', 'FILE' or die "Cannot open: $!";
my @file = <$fh>;
close $fh;

for (0 .. $#file) {   # read from the first line to the last
  if($file[$_] =~ /QUERY/){  # if the contents of a particular line matches the query pattern …
Run Code Online (Sandbox Code Playgroud)

perl

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

如何在Perl中从一个文件中获取查询,搜索另一个文件并输出到第三个文件?

编辑:我的原始标题有点改变.我怀疑当前的标题并没有揭示我的最初目的:让Perl自动使用一个文件的内容作为搜索关键字的来源来搜索另一个文件,然后将匹配输出到第三个文件.

这意味着如果没有这种自动化,我将不得不手动键入FILE1逐个列出的查询术语,并FILE2通过简单地编写类似的东西一次获得一个匹配while(<FILE2>){if (/query terms/){print FILE3 $_}}.

更具体地说,FILE1应该看起来像这样:

azure
Byzantine
cystitis
dyspeptic
eyrie
fuzz
Run Code Online (Sandbox Code Playgroud)

FILE2 可能(或可能不)看起来像这样:

azalea        n.  flowering shrub of the rhododendron family
azure         adj. bright blue, as of the sky 
byte          n. fixed number of binary digits, often representing a single character
Byzantine     adj. of Byzantium or the E Roman Empire
cystitis      n. inflammation of the bladder
Czech         adj. of the Czech Republic or Bohemia
dyslexic      adj. …
Run Code Online (Sandbox Code Playgroud)

perl hash

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

如何使用Perl将一个文件的列替换为另一个文件的列?

假设文件1有两列,看起来像:

fuzz          n.  flowering shrub of the rhododendron family
dyspeptic     adj. bright blue, as of the sky 
dysplexi      adj. of Byzantium or the E Roman Empire
eyrie         adj. of the Czech Republic or Bohemia
azalea        adj. suffering from dyslexia
Czech         adj. suffering from dyspepsia
Byzantine     n. eagle's nest
azure         n. mass of soft light particle

文件2只有一个clumn,看起来像:

azalea
azure
Byzantine
Czech
dyslexic
dyspeptic
eyrie
fuzz

我希望文件1的第一列替换为文件2的列.因此,文件3应如下所示:

azalea        n.  flowering shrub of the rhododendron family
azure         adj. bright blue, as of the …

perl

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

如何使用Perl将数据从有缺陷的DVD复制到我的硬盘?

情况是这样的:我的系统(Win XP Pro)无法从DVD磁盘复制一个巨大的视频文件(大约6演出),这可能是有缺陷的,有划痕的或者其他什么但可以使用带有几帧的mplayer播放虽然充满马赛克.当复制过程持续一段时间后,系统将中止工作并向我发出警告"发生循环冗余校验校验和错误".然后复制的所有内容都会自动删除.

我在想Perl应用可能会解决这个问题.我的想法是:我一次复制一兆的视频数据.如果发生读取错误,我让perl忽略这个特定的1兆的数据,并且一次复制其余的视频仍然是一个兆字节.

顺便说一句,我也注意到一些商业软件可以完成这项工作,但试验中存在局限性.

以下脚本是我到目前为止尝试过的.它一次从有缺陷的DVD磁盘复制数据一兆,但它像Win XP一样失败.唯一的区别是perl不会删除已经复制的内容.就我而言,它将大约900兆的视频数据复制到我的硬盘上,这个900兆的部分视频仍然可以用mplayer播放.但我的目标是复制所有好的,大多数,只留下所有坏的,少数.

    use strict;
    use warnings;

    $/ = \1_048_576;  

    open my $in, "<", 'D:\tobecopied.mkv' or die $!;
        binmode $in;
    open my $out, ">", 'E:\copied.mkv' or die $!;
        binmode $out;

    while (<$in>) {
        print $out $_;
    }
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何实现这一目标.希望有人在这里可以给我一个提示或线索.总是如此谢谢:)

perl checksum copy crc

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

标签 统计

perl ×8

hash ×2

checksum ×1

copy ×1

crc ×1

encoding ×1

filenames ×1

readdir ×1

regex ×1

utf-8 ×1