【问题标题】:Print output to screen differs from output to file打印输出到屏幕不同于输出到文件
【发布时间】:2020-12-08 07:00:48
【问题描述】:

使用 print 运算符将键/值数组写入外部 javascript 文件会生成与打印到屏幕不同的输出,尽管我尽了最大努力,但我不知道为什么。具体来说,当打印到屏幕时,如预期的那样,我的 Perl 脚本输出:

var genusSpecies={"Adam's Needle (Yucca filamentosa)":["Adam's Needle (Yucca filamentosa)1.jpg","._Adam's Needle (Yucca filamentosa)2.jpg"...

但是,当打印到外部 JavaScript 文件时,点下划线 ._ 不正确地添加到数组的键和值之前,输出:

var genusSpecies={"._Adam's Needle (Yucca filamentosa)":["._Adam's Needle (Yucca filamentosa)1.jpg","._Adam's Needle (Yucca filamentosa)2.jpg"...

这是我的 Perl 脚本:

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

use JSON::PP;

use English;  ## use names rather than symbols for special variables

my $dir = './Plants1024';

opendir my $dfh, $dir or die "Can't open $dir: $OS_ERROR";
my %genus_species;  ## store matching entries in a hash

for my $file (readdir $dfh)
{
    next unless $file =~ /.(jpe?g|png)$/i;  ## entry must have jpg, jpeg, or png extension, case insensitive
    my $genus = $file =~ s/\d*\.(?i)(jpe?g|png)(?-i)$//r;
    push(@{$genus_species{$genus}}, $file);  ## push to array, the @{} is to cast the single entry to a reference to a list

}

@{$genus_species{$_}} = sort @{$genus_species{$_}}
   for keys(%genus_species);

my $str = (JSON::PP->new->utf8->canonical->encode(\%genus_species));  ## define array in Javascript outputting elements containing image file names

print "var genusSpecies=", $str;  ## Inserted this line to test "print" output... prints properly WITHOUT adding "._"

my $filename = './Plants1024/PhotoArray.js';

 open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
 print $fh "var genusSpecies=", $str;  ## saves JavaScript key/value array in external JavaScript file, BUT improperly prepends "._" to both keys and values 
 close $fh;

有趣的是,只有在我的 Raspberry Pi4 上执行此 Perl 脚本时,屏幕上的输出与文件的输出才会有所不同,将._ 添加到写入文件中的数组键/值中。

在我的 Mac 上,正如预期的那样,屏幕和文件输出是相同的。更重要的是,在 Mac 上执行我的 Perl 脚本时,._ 的前缀并没有不正确。

也许数组键/值中的空格会导致这种行为,但为什么只在 Raspberry Pi4 而不是 Mac 上?请指教。

【问题讨论】:

  • Re "也许数组键/值中的空格会导致这种行为",您不是在打印键或值,而是在打印两个字符串。如果你说的是真的,这将是 Perl 或 Raspberry 的 IO 系统中的一个严重错误。你有同样的问题吗:my $qfn = './Plants1024/PhotoArray.js'; open(my $fh, '>', $qfn) or die("open \"$qfn\": $!\n"); print $fh 'genusSpecies={"Adam'."\n";
  • 顺便说一句,语言的名称是 Perl,而不是 PERL。这不是首字母缩写词。
  • ikegami... 这是上述代码的文件输出: genusSpecies={"Adam
  • 好的,在您的原始程序中,将print $fh "var genusSpecies=", $str; 替换为my $s = substr($str, 0, 100); print $fh "var genusSpecies=", $s . unpack("H*", $s); 并提供输出
  • 好的,它与写入文件无关,因为它在print 之前已经包含._。 (如果您在打印到控制台时没有在控制台上看到 ._ 将是一个错误,但我现在假设您犯了一个错误)。

标签: perl


【解决方案1】:

默认情况下,ls 隐藏以. 开头的文件

$ ls -1
'Adam'\''s Needle (Yucca filamentosa)'

$ ls -a1
.
..
'._Adam'\''s Needle (Yucca filamentosa)'
'Adam'\''s Needle (Yucca filamentosa)'

这会让您认为您没有此类文件,但它们确实存在。

readdir 不会忽略此类文件。您可以通过添加来解决此问题

next if $file =~ /^\./;

虽然readdir 不会忽略以. 开头的文件,但它可能会在Mac 上忽略以._ 开头的文件。 Mac 创建此类文件以存储有关同名文件的额外信息。我猜你正在阅读的目录是在 Mac 上创建的。

【讨论】:

  • ikegami...您的“next if”语句解决了问题...谢谢!!!
  • ._ 文件是 MacOS 在不支持备用流的文件系统上存储文件资源分支的方式。我觉得它们非常烦人,最可恨。
猜你喜欢
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 2010-10-21
相关资源
最近更新 更多