小编sfr*_*sfr的帖子

在 C 中展开 For 循环

我试图将这个循环展开 2 倍。

for(i=0; i<100; i++){
  x[i] = y[i] + z[i];
  z[i] = y[i] + a[i];
  z[i+1] = y[i] * a[i];
}
Run Code Online (Sandbox Code Playgroud)

我把它展开到:

 for(i=0; i<100; i+=2){
   x[i] = y[i] + z[i];
   x[i+1] = y[i+1] + z[i+1];
   z[i] = y[i] + a[i];
   z[i+1] = y[i] * a[i];
 }
Run Code Online (Sandbox Code Playgroud)

我不确定如何展开 z[i] 的行,因为原始 for 循环已经有 z[i+1]。任何人都可以帮助我理解这一点吗?

c optimization loop-unrolling

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

使用正则表达式匹配模式并存储到数组中

我有一个类似的帖子(请参阅其他帖子),但从那时起我尝试做的事情略有不同。我正在使用与/79(week\d+[a-z])/i该问题相同的正则表达式匹配。

我有一个包含六行的文件,每行一个不同的路径。例如,包含字符串“cat”的 3 行和包含字符串“dog”的 3 行。

文件.txt

/mypath/sd-urt7-dfc-adfj345h-d0-79week48a-DFC-lk-my_cat.text  
/mypath/sd-urt7-afd-parent-79week46d-AFD-lk-my_cat.text  
/mypath/sd-urt7-ert-parent-79week50c-ERT-lk-my_cat.text 
/mypath/sd-urt7-dfc-adfj345h-d0-79week48a-DFC-lk-my_dog.text  
/mypath/sd-urt7-afd-parent-79week46d-AFD-lk-my_dog.text  
/mypath/sd-urt7-ert-parent-79week49b-ERT-lk-my_dog.text 
Run Code Online (Sandbox Code Playgroud)

我想从每个路径中取出“weekxxX”部分并将其打印到一个文件中。这是我到目前为止所拥有的:

use strict;
use warnings;
use feature qw(say);
use autodie;

    open (my $fh, '<', "file.txt") or die "Couldn't open `file.txt`\n";

    foreach my $line (<$fh>){ #goes through each line in the file

        chomp $line; #chomps new line character from each line

        if ($line =~ /cat/) { #if the path includes string "cat"
            #use the regex at top of post to get weekxxX of each …
Run Code Online (Sandbox Code Playgroud)

regex perl

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

重命名具有任何扩展名的perl文件

我希望能够重命名具有不同扩展名的perl文件,只要文件名相同即可。例如,

ExampleFile.txt
ExampleFile.html
FirstFile.txt

我希望我可以在Linux上使用Perl单行代码来更改包含字符串“ ExampleFile”作为名称的文件,而不管其扩展名是“ FinalFile”,但不适用于任何其他文件,例如“ FirstFile”。我正在调查,rename但似乎无法弄清楚如何将其用于任何文件扩展名。

这样做rename "$findstring.*", "$replacestring.*";似乎不起作用,因为perl无法识别*代表任何文件扩展名。

这里是一个示例代码,可以显示我的问题。

#!/usr/bin/perl
use strict;
use warnings;

my $findstring = "ExampleFile";
my $replacestring = "FinalFile";

rename ("myDir/$findstring.*", "myDir/$replacestring.*"); 

Run Code Online (Sandbox Code Playgroud)

regex linux perl glob

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

使用Perl解析块中的文本

我有一个包含多个测试块的文件。对于每个测试块,我希望能够提取方括号中的内容,包含单词“ area”的第一个实例的行以及方括号右侧的内容。一切都会是一个字符串。本质上,我想做的就是将每个字符串存储到哈希中的变量中,这样我就可以将其打印到3列的CSV文件中。

这是文件外观的一个示例:

学生-[K-6]数学上
非常出色/home/area/kinder/mathadvance.txt,有12
位K- 12年级的学生在数学上表现出色。
放学后放到特殊课程中。
请参阅/home/area/overall/performance.txt,200名

学生-[初中]表现
较差学生的整体表现较弱。
夏季计划服务,如
“ /home/area/services/summer.txt”中所示,212

学生-[K-6]体育锻炼时间段
/home/area/pe/schedule.txt,303
为基于PE分配的时隙在学生的年级。参考
/home/area/overall/classtimes.txt,90

我想要一个最终的csv文件,如下所示:

年级,主题,
K-6 路径 ,数学出色,/ home / area / kinder / mathadvance.txt,12
K-6,体育锻炼时间段,/ home / area / pe / schedule.txt,303
初级,表现不佳 ,“ / home / area / services / summer.txt”,212

由于它是一个csv文件,我知道在导出到excel时它也会在行号处分开,但我对此表示满意。
我首先将成绩类型放入数组中,因为我希望能够为不同的成绩水平添加更多字符串。

到目前为止,我的程序如下所示:

#!/usr/bin/perl
use strict;
use warnings;

my @grades = ("K-6", "Junior", "Community-College", "PreK");
Run Code Online (Sandbox Code Playgroud)

我当时想我将需要执行某种系统sed命令来获取括号中的内容并将其存储到变量中。然后,我将抓住该行括号右侧的所有内容并将其存储到变量中。然后,我将grep查找包含“ area”的行以获取路径,并将其作为字符串存储到变量中,将其放入哈希中,然后打印到csv中。我不确定我是否正在考虑正确的方法。此外,我没有想法如何对文件中的每个文本块执行此操作。我需要按块进行操作,因为每个块都有自己对应的等级,主题和路径。

perl

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

Perl 在第二个元素之后加入数组

我想在第二个空格之后用一句话来表达所有内容。我通过拆分和加入来做到这一点。我想在第二个元素之后加入所有内容,但我不知道该怎么做。这个句子可以有几个词,所以我不想硬编码结束范围。

$sentence = "a b c and d";
@array = split(" ", $sentence);
$str = join(' ',$array[???]);
Run Code Online (Sandbox Code Playgroud)

我想要一个看起来像的输出:

c and d 
Run Code Online (Sandbox Code Playgroud)

perl split join

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

Perl 自动化散列填充和键名

我有许多错误字符串。我正在将它们与我已有的模式相匹配。如果它们完全相同,我希望它们属于完全相同的错误故障。如果它们匹配模式但与哈希中的先前字符串有一些不同,我想给它相同的错误名称,但附加不同的数字。

这是一个示例输入文件:

there are 5 syntax issues with semicolon
there are 11 syntax issues with semicolon
the file contains 5 formatting issues
there are 1 syntax issues with semicolon
check script for formatting issues
2 syntax issues have been found
the file contains 1 formatting issues
6 syntax issues have been found
Run Code Online (Sandbox Code Playgroud)
use warnings;
use strict;

my %errors;
my $file = "listoferrormessages.txt"

open my $fh,'<',$file or die "Could not open $file: $!";

while(my $line = <$fh>){

if( $line =~ /syntax/){ …
Run Code Online (Sandbox Code Playgroud)

perl

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

Perl 按值的值对哈希进行排序

我有一个看起来像的哈希


'Jarrod' => {
                                'Age' => '25 ',
                                'Occupation' => Student
                              },
'Elizabeth' => {
                                'Age' => '18',
                                'Occupation' => Student
                                },
'Nick' => {
                                'Age' => '32 ',
                                'Occupation' => Lawyer
                               },
Run Code Online (Sandbox Code Playgroud)

我正在尝试按年龄对它们进行排序,所以它看起来像

'Nick' => {
                                'Age' => '32 ',
                                'Occupation' => Lawyer
                               },
'Jarrod' => {
                                'Age' => '25 ',
                                'Occupation' => Student
                              },
'Elizabeth' => {
                                'Age' => '18',
                                'Occupation' => Student
                                },

Run Code Online (Sandbox Code Playgroud)

但我似乎不知道如何访问年龄之后的任何内容。排序哈希键时如何访问值的值?

sorting perl hash

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

Perl如何在程序完成后删除目录

我想允许用户通过命令行(例如--clean)传递清理参数,以删除包含不再需要的文件的目录。当我尝试执行remove_tree时,它将在程序运行期间执行。如何获得它,以便在整个运行完成后执行该操作,然后删除不再需要的目录?

所以我/$cleanup在我的getOptions中。

if (defined $cleanup){
remove_tree("my path here");
}
Run Code Online (Sandbox Code Playgroud)

如何删除目录不是问题,而是如何仅在用户通过命令行选择时删除它们。

编辑:我尝试使用END块。

这是我的代码的外观。

@arr = (John, Daniel, Mary); #there is path for each one of them generated
foreach my $arr (@array){
......
END{
remove_tree("/mydir/names/$array/outputfiles") if defined $cleanup;
};
}
Run Code Online (Sandbox Code Playgroud)

我这样做是因为我希望为每个名称完成此操作,但是它不起作用。如果我这样做,它确实可以工作,但是我宁愿用一行而不是三行。

@arr = (John, Daniel, Mary); #there is path for each one of them generated
foreach my $arr (@array){
......
END{
remove_tree("/mydir/names/John/outputfiles") if defined $cleanup;
};
}
Run Code Online (Sandbox Code Playgroud)

perl

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

2D 阵列打印作为参考

我有类似于下面的代码:

my @array1 = (); #2d array to be used
my $string1 = "blank1";
my $string2 = "blank2";
my $string3 = "blank3";

my @temp = ($string1, $string2, $string3);
push (@array1, \@temp);
Run Code Online (Sandbox Code Playgroud)

我分配字符串然后将它们放入数组的原因是因为它们位于循环中并且值在循环中更新(@array1 未在循环中声明)。

当我运行程序时,它只提供对数组的引用,而不是实际的二维数组。如何让它将内容打印为二维数组,而不是作为参考或展平为一维数组?

我想要一个像这样的输出[[blank1, blank2, blank3],....],这样我就可以像这样访问它$array1[i][j]

arrays perl multidimensional-array

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

如何使用时间戳获取Perl中的最新文件

我有一个充满文件日志的文件夹。日志每周生成一次。例如。

/path/week20a.log
/path/week20b.log
/path/week29d.log
/path/week30c.log
/path/week31a.log
/path/week32a.log

我想获取上周(上周是本周之前的最新日志文件的最新)和上周的最新日志。在这种情况下,

/path/week21d.log
/path/week20c.log

为此,我有两个子例程函数:

sub getweek {
$week = ???; #where week should return one of the 'week***' listed above
my @files = File::Find::Rule->file()
                            ->name('*$week.log')
                            ->in(mydir);

my @files_with_mtimes = map +{ name => $_, mtime => (stat $_)[9] }, @files;
our @sorted_files = reverse sort { $a->{mtime} <=> $b->{mtime} } @files_with_mtimes;

return $sorted_files[0]{name};
}
Run Code Online (Sandbox Code Playgroud)



问题是我正在使用当前一周Time::Piece->new->strftime("%V"),然后这样做是-2为了让前一周变得更早。我在硬编码中假设2周前的最新日志将一直存在,并且将是前一个。如果上周没有跑步怎么办?在这种情况下,最后一个日志将是该周之前的一周,而之前的日志将是该周之前的日志。

我怎么能有两个子例程,其中一个获取上周的日志,Time::Piece->new->strftime("%V")-1如果存在则记录,如果不存在,则拒绝在此之前查找一周,然后根据该例程执行类似的操作,以找到该周之前的最后一个日志。

perl

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

Perl Printf 指定长度的两个字符串

我正在打印一个需要格式化的字符串。我想使用存储在另一个变量中的一组字符来打印 printf,但我不确定如何执行此操作。

my $max_len = max map length, keys %hash;
printf ("%s %s\n", $string1, ":$string2");

Run Code Online (Sandbox Code Playgroud)

显然这是输出,string1 :string2但我想要的是第一列的总宽度为 $max_len。我怎样才能做到这一点?

perl printf

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