gzファイルのPerlシンボリックリンク

gzファイルのPerlシンボリックリンク

file1.txt.gzファイルがあり、次のようにPerlを使用して通常のファイルへのシンボリックリンクを作成しようとしています。

symlink ("file1.txt.gz", orig_file1);

しかし、これは私が望んでいないorig_file1.gzという名前の新しいファイル名に.gzサフィックスを追加しないとうまくいかないようです。

ベストアンサー1

TL;DR - 常に何かを引用してください。

Perlコードで常に使用されるこの場合、裸の単語(または出力が接続演算子に関連付けられる必要がある2つの潜在的なサブルーチンである裸の単語)がuse strict失敗します。orig_file1orig_file1gz.

% perl -Mstrict -e 'symlink "x", asdf'
Bareword "asdf" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.
% perl -Mstrict -e 'symlink "x", asdf.gz'
Bareword "asdf" not allowed while "strict subs" in use at -e line 1.
Bareword "gz" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.
% 

修正は、最初の用語だけでなく、すべての用語を正しく引用することです。

#!/usr/bin/env perl
use strict;
use warnings;
symlink "file1.txt.gz", "orig_file1";

この動作はシェル(Perlはシェルとある程度関連している)と照合することができ、これを介して(時々)何かを引用する必要はありません。

#!/bin/sh
ln -s -- file1.txt.gz orig_file1

たとえ特に変数の場合シェルは予期しない操作を実行するために別のシェルで異なる特殊文字を使用する可能性があるため、シェルから引用する必要があります(これは使用法の提案であり、厳密な要件ではありません)。

多少関連する言語であるTCLを使用すると、非常に単純な構文が使用されるため、引用を避けることができます。

file link orig_file1 file1.txt.gz

しかし、特にTCLに慣れていない人がコードを見ている場合は、引用すべきいくつかのことがあります。

file link "orig_file1" "file1.txt.gz"

おすすめ記事