我的Perl脚本输出并记录了许多行文本,并进行了一些清理并压缩了END块中的一些日志.
问题是当您在命令行上执行以下操作时:
perl myscript.pl | head -n 10
Run Code Online (Sandbox Code Playgroud)
这会导致脚本在输出10行后立即死亡,因此END块不会执行,并且日志不会被压缩.有没有办法解决这个问题,并确保我的END块中的代码仍然执行?
我试图在Perl单行中打印单引号时遇到了这个问题.我最终想通了你必须逃脱它们'\''.这里有一些代码来说明我的问题.
让我们从打印文本文件开始.
perl -ne 'chomp; print "$_\n"' shortlist.txt
red
orange
yellow
green
blue
Run Code Online (Sandbox Code Playgroud)
现在让我们为每行打印文件的名称.
perl -ne 'chomp; print "$ARGV\n"' shortlist.txt
shortlist.txt
shortlist.txt
shortlist.txt
shortlist.txt
shortlist.txt
Run Code Online (Sandbox Code Playgroud)
然后我们可以在每一行周围添加单引号.
perl -ne 'chomp; print "'$_'\n"' shortlist.txt
shortlist.txt
shortlist.txt
shortlist.txt
shortlist.txt
shortlist.txt
Run Code Online (Sandbox Code Playgroud)
等等没有用.让我们再试一次.
perl -ne 'chomp; print "'\''$_'\''\n"' shortlist.txt
'red'
'orange'
'yellow'
'green'
'blue'
Run Code Online (Sandbox Code Playgroud)
所以我现在就开始工作了.但我仍然对为什么'$ _'评估程序名称感到困惑.也许这很容易,但有人可以解释或链接到一些文档吗?
编辑:我在Red Hat 5上运行Perl 5.8.8
我无法追踪分段错误.在将我的c程序编译为汇编之后,我正在编辑它并添加一些东西.
我添加了一些代码,包括本节:
.SB1:
call fib
jmp .LBL2
Run Code Online (Sandbox Code Playgroud)
那部分工作正常.但现在我想打电话给测试,也许会跳到另一个标签.现在,我只是在玩它,看看我是否可以学习如何运作(采取婴儿步骤).所以我把代码更改为:
.SB1:
call fib
test %esp, 0xfffffff
jz .SB2
jmp .LBL2
.SB2:
jmp .LBL2
Run Code Online (Sandbox Code Playgroud)
但是现在我遇到了分段错误.谁知道为什么?如果您需要更多信息或希望代码重现,请告诉我.
#!/bin/perl
use strict;
use warnings;
my($japh,$q,$qq,%b)= "Just another Perl hacker\n";
$_=join'',(
07625127776,
0122456410,
03441733416,
01420121552,
04373570104,
07143446334);s#9#f#;#s;#f#9#s;;
s}9}b};$q=$_;*9=
sub {
$japh = "";
print $japh;
}; map { /^((?i)(?#q#;
print $japh;#()[^
for (my $(b) = 1; $(b) < $(q); \$b++;) {
\/g])+[\](^.^)\[
}
]*$/x?do{$qq=((ord)-96).(~~%b-$?)
;$/#;
=$+;$q=~s/$qq/${\/}/g;}:9->({});
}qw(
a b c d e f g h i j k l m n o p q r s t u v w x y z
);$qq=[$q,%b];$\=pack q*h\**
,qq$$.$$qq[0];9->();
Run Code Online (Sandbox Code Playgroud)
我认为很多是额外的/纯粹的混淆.我知道我们将"只是另一个Perl黑客"分配给$ japh,我们打印它但是在我们这样做之前将它分配给""我不知道它是如何工作的.有人能解释一下这里发生了什么吗?谢谢!
我有一个HEX数据文件我想用python将它转换为SIGNED DECIMAL.
int('0xffd2',16)因为它将HEX转换为无符号DEC,所以不是解决方案.知道怎么做吗?
0xffd2, 65490
0xffcb, 65483
0xffcb, 65483
0xffcc, 65484
0x10, 16
0xc, 12
0xd, 13
0x0, 0
0xfffe, 65534
Run Code Online (Sandbox Code Playgroud) 我有兴趣更改正则表达式单词边界\b以包含其他字符(例如,a .不会计为边界).我知道它是\w和\W人物之间的界限.
my $_ = ".test";
if ( /(\btest\b)/ ){
print;
print " $1\n";
}
if ( /((?:(?<=\W)|^)test(?:(?=\W)|$))/ ){
print;
print " $1\n";
}
Run Code Online (Sandbox Code Playgroud)
这就是我提出的,而我所要做的就是改变\W类似的东西[^\w.],但我仍然想知道Perl如何\b在正则表达式中解释.我试着像这样贬低它:
my $deparser = B::Deparse->new("-sC", "-x10");
print $deparser->coderef2text( sub {
my $_ = ".test";
if ( /(\btest\b)/ ){
print;
print " $1\n";
}
if ( /((?:(?<=\W)|^)test(?:(?=\W)|$))/ ){
print;
print " $1\n";
}
});
Run Code Online (Sandbox Code Playgroud)
我希望它会扩展\b到相当于它的东西.什么\b相当于?你能\b以某种方式进一步解密或其他表达吗?
在我的编程任务介绍中,我遇到了一个问题.我必须创建一个运输计算器,根据它的重量和发送包裹的程度来运送您的包裹.他们只能运送10磅的包裹.
费用基于每运送500英里.它们不是按比例分配的,即600英里与900英里的费用相同,即600英里被计为2个500英里的分段.
这是他们给我的表格:
包装重量率每500英里运输2磅或更少$ 1.50超过2但不超过6 $ 3.70超过6但不超过10 $ 5.25
问题是我每次进入:
重量:1.0英里:2000
当它被认为是6.00美元时,我得到58.50美元.这是我的代码如下.顺便说一句,我不能使用循环.
#include <stdio.h>
int main(void){
float weight, shippingCharge;
int miles, mTotal, mModule, fTotal;
printf("Weight: ");
scanf("%f", &weight);
printf("Miles: ");
scanf("%d", &miles);
mTotal = miles / 500;
mModule = miles % 500;
if(mModule > 0){
fTotal = mTotal + 1;
}
if( weight <= 2){
shippingCharge = fTotal * 1.50;
printf("Your shipping charge is $%.2f\n", shippingCharge);
}else{
if(weight >= 2 && weight <= 6){
shippingCharge = fTotal * 3.70;
printf("Your …Run Code Online (Sandbox Code Playgroud)