如何解决Perl中变量file_size_kb无法共享及正则修饰符错误问题
问题1:子例程无法访问
$file_size_kb 你在log_no_reconciliation子例程中直接调用$file_size_kb会报错,因为该变量是用my声明的词法变量,作用域仅局限于声明它的主程序代码块,子例程不在这个作用域内,自然无法访问。
解决方法:将$file_size_kb作为参数传递给子例程:
- 调用子例程时传入参数:
log_no_reconciliation($pdf_file, $file_size_kb); - 修改子例程定义,新增参数接收逻辑:
sub log_no_reconciliation { my ($file, $size_kb) = @_; open my $log_fh, '>>', 'reconciliation.log' or die "Could not open log file: $!"; print $log_fh "No reconciliation performed for $file because its size is $size_kb KB.\n"; close $log_fh; }
问题2:未知正则表达式修饰符"/v"和"/e"错误
这个错误出现在#Path to the PDF file下方的代码行,核心原因是你给$pdf_file赋值时漏加了引号,导致Perl把路径字符串当成正则表达式解析(比如写成my $pdf_file = path/to/your/file.pdf;而非带引号的形式)。Perl会将path/to/your/file.pdf识别为m/path/to/your/file.pdf/,若路径最后一个/后存在v、e等字符,会被当作正则修饰符,而Perl不支持这类修饰符,因此报错。
解决方法:确保路径字符串被单引号或双引号包裹,就像你提供的示例代码一样:
my $pdf_file = 'path/to/your/file.pdf';
若路径包含空格等特殊字符,可使用双引号包裹并转义,或用单引号保持内容原样(单引号内的字符不会被转义)。
修正后的完整代码
# Path to the PDF file my $pdf_file = 'path/to/your/file.pdf'; # Size threshold in kilobytes my $size_threshold_kb = 1_000_000; # Get the file size in bytes my $file_size_bytes = -s $pdf_file; # Convert bytes to kilobytes my $file_size_kb = $file_size_bytes / 1024; # Check if the file size is less than the threshold if ($file_size_kb < $size_threshold_kb) { # Perform PDF impression reconciliation reconcile_pdf_impression($pdf_file); } else { # Log that no reconciliation happened log_no_reconciliation($pdf_file, $file_size_kb); } sub reconcile_pdf_impression { my ($file) = @_; # Replace with actual reconciliation logic print "Performing PDF impression reconciliation for $file.\n"; } sub log_no_reconciliation { my ($file, $size_kb) = @_; open my $log_fh, '>>', 'reconciliation.log' or die "Could not open log file: $!"; print $log_fh "No reconciliation performed for $file because its size is $size_kb KB.\n"; close $log_fh; }
内容的提问来源于stack exchange,提问作者xantana
相关产品推荐
相关产品推荐

