Jika Anda mendapati peringatan ini pada skrip Perl, artinya Anda tengah dalam masalah besar.

Menetapkan variable

Menetapkan nilai pada suatu variable, namun tak pernah menggunakannya, atau menggunakan sebuah variabel tanpa pernah menetapkan suatu nilaipun, adalah tindakan yang jarang dianggap benar pada kode apapun.

Mungkin hal yang logis adalah jika Anda melakukan kesalahan tulis (typo), dan karenanya Anda menemui variabel yang hanya dipakai sekali.

Berikut ini adalah sebuah contoh di mana kita hanya menetapkan nilai pada sebuah variabel:

use warning;

$x = 42;

Kode ini akan menghasilkan peringatan sebagai berikut:

Name "main::x" used only once: possible typo at ...

Bagian "main::" dan $ mungkin membingungkan Anda. "main::" ada secara asali (default) setiap variabel dalam Perl adalah bagian dari "main". Ada juga sejumlah hal yang disebut "main::x" dan hanya satu di antaranya memiliki tanda $ di awalnya. Jika ini terdengar sedikit membingungkan, jangan khawatir. Hal ini memang membingungkan, tapi saya harap Anda tak akan berurusan dengan hal ini dalam jangka yang lama.

Mengambil nilainya saja

Jika Anda mengalami use a variable only once

use warning;

print $x;

maka kemungkinan Anda akan mendapati dua peringatan:

Name "main::x" used only once: possible typo at ...
Use of uninitialized value $x in print at ...

Salah satu di antaranya adalah yang sedang kita bahas sekarang, sementara yang lainnya dibahas di penggunaan nilai tak terinisiasi.

Mana typo-nya?

Anda mungkin bertanya.

Bayangkan seandainya seseorang menggunakan variabel $l1. Kemudian, Anda ingin coba menggunakan variabel yang sama tapi Anda menuliskan $ll. Tergantung jenis font yang Anda gunakan, keduanya mungkin akan terlihat sangat mirip.

Atau mungkin ada variabel yang disebut $color namun karena Anda orang Inggris dan secara otomatis Anda menulisnya $colour saat Anda memikirkannya.

Atau ada variabel yang disebut $number_of_misstakes dan Anda tidak memerhatikan kesalahan tulis pada variabel asli dan Anda menulis $number_of_mistakes.

Kini Anda mengerti.

Jika Anda beruntung, kemungkinan Anda akan membuat kesalahan hanya sekali, tapi jika tak seberuntung itu, dan Anda menggunakan variabel yang tidak tepat dua kali, maka peringatan ini tidak akan muncul. Akhirnya jika Anda menggunakan variabel yang sama sebanyak dua kali Anda mungkin memiliki alasan tertentu.

Jadi, bagaimana Anda bisa menghindari kesalahan ini?

Yang pertama, coba hindari menggunakan variabel dengan huruf-huruf yang ambigu di dalamnya dan berhati-hatilah saat menuliskan nama-nama variabel.

Jika Anda ingin memecahkan masalah ini, gunakan saja use strict!

use strict

Seperti yang dapat Anda lihat pada contoh-contoh di atas, saya tidak menggunakan strict. Jika saya menggunakannya, maka bukannya mendapatkan peringatan tentang kemungkinan kesalahan tulis, saya malah akan mendapat kesalahan soal waktu kompilasi: Global symbol requires explicit package name.

Hal tersebut akan terjadi bahkan jika Anda menggunakan variabel yang tidak tepat lebih dari sekali.

Tentu ada saja orang yang mau repot dan menaruh "my" di depan variabel yang salah itu, tapi Anda bukan salah satunya, kan? Anda akan memikirkan masalahnya dan mencarinya hingga Anda menemukan nama variabel yang sesungguhnya.

Cara yang paling umum untuk melihat pesan peringatan ini adalah saat Anda tidak menggunakan strict.

Maka Anda dalam masalah besar.

Masalah lain ketika menggunakan strict

Seperti yang GlitchMr dan komentator anonim tunjukkan, ada beberapa masalah lain:

Kode berikut juga dapat menghasilkan masalah

use strict;
use warning;

$main::x = 23;

Peringatannya adalah: Name "main::x" used only once: possible typo ...

Di sini tampak jelas dari mana 'main' berasal, atau pada contoh berikutnya, dari mana Mister berasal. (petunjuk: 'main' dan 'Mister' keduanya adalah nama paket. Jika tertarik, Anda bisa melihat pesan kesalahan lainnya yang melibatkan hilangnya nama-nama paket). Pada contoh berikutnya, nama paketnya adalah 'Mister'.

use strict;
use warning;

$Mister::x = 23;

Peringatannya adalah: Name "Mister::x" used only once: possible typo ...

Contoh berikut ini juga menghasilkan peringatan. Dua kali:

use strict;
use warning;

use List::Util qw/reduce/;
print reduce { $a * $b } 1..6;

Name "main::a" used only once: possible typo at ...
Name "main::b" used only once: possible typo at ...

Hal ini terjadi karena $a dan $b adalah variabel spesial yang digunakan dalam fungsi built-in sehingga Anda tidak perlu mendeklarasikannya, tapi Anda hanya menggunakannya sekali saja di sini. (Sebenarnya belum jelas bagi saya mengapa ini menghasilkan peringatan, saat kode yang sama menggunakan sort tidak menghasilkan peringatan, tapi Perl Monks mungkin bisa menjawabnya).